问一个关于Swing的问题,不知道还有没有人在用! 我用Popup弹出一个窗口Jpanel,上面加了一个JtextArea。但是点击标签后,弹出来的窗口,是无法获取焦点的,就是text不能辩解,请问,各位大佬,怎么解决,这个问题呢,或者说,怎么实现这样的弹窗。谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 代码如下:import java.awt.BorderLayout;import java.awt.Color;import java.awt.Component;import java.awt.Cursor;import java.awt.Dimension;import java.awt.Font;import java.awt.Point;import java.awt.Toolkit;import java.awt.event.FocusEvent;import java.awt.event.FocusListener;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;import javax.swing.BorderFactory;import javax.swing.JComponent;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.JTextField;import javax.swing.Popup;import javax.swing.PopupFactory;import javax.swing.ScrollPaneConstants;import javax.swing.SwingConstants;import javax.swing.SwingUtilities;import javax.swing.event.AncestorEvent;import javax.swing.event.AncestorListener;public class TextModel extends JPanel { private static final long serialVersionUID = 4529266044762990227L; private Calendar select; private JPanel TextPanel; private Font font = new Font("宋体", Font.PLAIN, 12); private SimpleDateFormat sdf; private boolean isShow = false; private Popup pop; private JComponent showDate; private TextModel() { select = Calendar.getInstance(); initPanel(); } /** * * 是否允许用户选择 * */ public void setEnabled(boolean b) { super.setEnabled(b); showDate.setEnabled(b); } /** * 得到当前选择框 */ public Date getDate() { return select.getTime(); } public String getStrDate() { return sdf.format(select.getTime()); } public String getStrDate(String format) { sdf = new SimpleDateFormat(format); return sdf.format(select.getTime()); } // 根据初始化的,初始化面板 private void initPanel() { TextPanel = new JPanel(new BorderLayout()); TextPanel.setBorder(BorderFactory.createLineBorder(Color.BLUE)); JPanel jp1 = new JPanel(new BorderLayout()); jp1.setBackground(new Color(160, 185, 215)); JLabel title = new JLabel("补充条款:", JLabel.CENTER); title.setFont(font); title.setBorder(BorderFactory.createEmptyBorder(2, 0, 0, 0)); jp1.setPreferredSize(new Dimension(175, 25)); jp1.add(title); TextPanel.add(jp1, BorderLayout.NORTH); JScrollPane scrollPane = new JScrollPane(); scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); scrollPane.setPreferredSize(new Dimension(175, 100)); TextPanel.add(scrollPane, BorderLayout.CENTER); final JTextArea textArea = new JTextArea(); textArea.setLineWrap(true); textArea.grabFocus(); scrollPane.setViewportView(textArea); JPanel jp3 = new JPanel(new BorderLayout()); jp3.setPreferredSize(new Dimension(175, 20)); jp3.setBackground(new Color(160, 185, 215)); final JLabel jl = new JLabel("OK"); jl.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { System.out.println("!!!!"); textArea.grabFocus(); textArea.requestFocusInWindow(); } @Override public void mouseEntered(MouseEvent e) { setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); } @Override public void mouseExited(MouseEvent e) { setCursor(Cursor.getDefaultCursor()); } @Override public void mousePressed(MouseEvent e) { jl.setForeground(Color.RED); } @Override public void mouseReleased(MouseEvent e) { jl.setForeground(Color.BLUE); } }); jl.setHorizontalAlignment(SwingConstants.CENTER); jl.setFont(font); jp3.add(jl, BorderLayout.CENTER); TextPanel.add(jp3, BorderLayout.SOUTH); this.addAncestorListener(new AncestorListener() { // 只要祖先组件一移动,马上就让popup消失 public void ancestorMoved(AncestorEvent event) { hidePanel(); } @Override public void ancestorAdded(AncestorEvent event) { } @Override public void ancestorRemoved(AncestorEvent event) { } }); } public void register(final JComponent showDate) { this.showDate = showDate; showDate.setRequestFocusEnabled(true); showDate.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent me) { showDate.requestFocusInWindow(); } }); this.setBackground(Color.WHITE); this.add(showDate, BorderLayout.CENTER); this.setPreferredSize(new Dimension(90, 25)); this.setBorder(BorderFactory.createLineBorder(Color.GRAY)); showDate.addMouseListener(new MouseAdapter() { public void mouseEntered(MouseEvent me) { if (showDate.isEnabled()) { showDate.setCursor(new Cursor(Cursor.HAND_CURSOR)); showDate.setForeground(Color.RED); } } public void mouseExited(MouseEvent me) { if (showDate.isEnabled()) { showDate.setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); showDate.setForeground(Color.BLACK); } } public void mousePressed(MouseEvent me) { if (showDate.isEnabled()) { showDate.setForeground(Color.CYAN); if (isShow) { hidePanel(); } else { showPanel(showDate); } } } public void mouseReleased(MouseEvent me) { if (showDate.isEnabled()) { showDate.setForeground(Color.BLACK); } } }); showDate.addFocusListener(new FocusListener() { public void focusLost(FocusEvent e) { hidePanel(); } public void focusGained(FocusEvent e) { } }); } // 隐藏选择面板 private void hidePanel() { if (pop != null) { isShow = false; pop.hide(); pop = null; } } // 显示选择面板 private void showPanel(Component owner) { if (pop != null) { pop.hide(); } Point show = new Point(0, showDate.getHeight()); SwingUtilities.convertPointToScreen(show, showDate); Dimension size = Toolkit.getDefaultToolkit().getScreenSize(); int x = show.x; int y = show.y; if (x < 0) { x = 0; } if (x > size.width - 175) { x = size.width - 175; } if (y < size.height - 170) { } else { y -= 188; } pop = PopupFactory.getSharedInstance().getPopup(owner, TextPanel, x, y); pop.show(); isShow = true; } public static void main(String[] args) { TextModel dateChooser1 = new TextModel(); TextModel dateChooser2 = new TextModel(); JTextField showDate1 = new JTextField("单击选择"); JLabel showDate2 = new JLabel("单击选择"); dateChooser1.register(showDate1); dateChooser2.register(showDate2); JFrame jf = new JFrame("测试选择器"); jf.getContentPane().add(showDate1, BorderLayout.NORTH); jf.getContentPane().add(showDate2, BorderLayout.SOUTH); jf.pack(); jf.setLocationRelativeTo(null); jf.setVisible(true); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }} HttpURLConnection.setRequestProperty不能设置authorization header??? JXTA跨网关通信问题 关于引用变量的疑问。 struts2配置问题求解 使用SUN 自带的那个glassfish 部署的EJB 怎么调用? java线程问题 有项目经验的大哥们说说项目中的命名问题 程序编译的时候报错,请看详细内容 weblogic8.1 为何jsp调不了javabean? java播放wav文件的方法 java多线程问题 大佬帮看看这些方法的return是返回到哪里 toString是什么意思
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.Popup;
import javax.swing.PopupFactory;
import javax.swing.ScrollPaneConstants;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.event.AncestorEvent;
import javax.swing.event.AncestorListener;public class TextModel extends JPanel { private static final long serialVersionUID = 4529266044762990227L; private Calendar select; private JPanel TextPanel; private Font font = new Font("宋体", Font.PLAIN, 12); private SimpleDateFormat sdf; private boolean isShow = false; private Popup pop; private JComponent showDate; private TextModel() {
select = Calendar.getInstance();
initPanel(); } /**
*
* 是否允许用户选择
*
*/ public void setEnabled(boolean b) { super.setEnabled(b); showDate.setEnabled(b);
} /**
* 得到当前选择框
*/ public Date getDate() { return select.getTime(); } public String getStrDate() {
return sdf.format(select.getTime());
} public String getStrDate(String format) {
sdf = new SimpleDateFormat(format);
return sdf.format(select.getTime());
}
// 根据初始化的,初始化面板 private void initPanel() { TextPanel = new JPanel(new BorderLayout());
TextPanel.setBorder(BorderFactory.createLineBorder(Color.BLUE));
JPanel jp1 = new JPanel(new BorderLayout());
jp1.setBackground(new Color(160, 185, 215));
JLabel title = new JLabel("补充条款:", JLabel.CENTER);
title.setFont(font);
title.setBorder(BorderFactory.createEmptyBorder(2, 0, 0, 0));
jp1.setPreferredSize(new Dimension(175, 25));
jp1.add(title);
TextPanel.add(jp1, BorderLayout.NORTH); JScrollPane scrollPane = new JScrollPane();
scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
scrollPane.setPreferredSize(new Dimension(175, 100));
TextPanel.add(scrollPane, BorderLayout.CENTER); final JTextArea textArea = new JTextArea();
textArea.setLineWrap(true);
textArea.grabFocus();
scrollPane.setViewportView(textArea); JPanel jp3 = new JPanel(new BorderLayout());
jp3.setPreferredSize(new Dimension(175, 20));
jp3.setBackground(new Color(160, 185, 215));
final JLabel jl = new JLabel("OK");
jl.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("!!!!");
textArea.grabFocus();
textArea.requestFocusInWindow();
}
@Override
public void mouseEntered(MouseEvent e) {
setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
} @Override
public void mouseExited(MouseEvent e) {
setCursor(Cursor.getDefaultCursor());
} @Override
public void mousePressed(MouseEvent e) {
jl.setForeground(Color.RED);
} @Override
public void mouseReleased(MouseEvent e) {
jl.setForeground(Color.BLUE);
}
});
jl.setHorizontalAlignment(SwingConstants.CENTER);
jl.setFont(font);
jp3.add(jl, BorderLayout.CENTER);
TextPanel.add(jp3, BorderLayout.SOUTH); this.addAncestorListener(new AncestorListener() {
// 只要祖先组件一移动,马上就让popup消失
public void ancestorMoved(AncestorEvent event) {
hidePanel();
} @Override
public void ancestorAdded(AncestorEvent event) {
} @Override
public void ancestorRemoved(AncestorEvent event) {
} }); } public void register(final JComponent showDate) { this.showDate = showDate; showDate.setRequestFocusEnabled(true); showDate.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent me) { showDate.requestFocusInWindow(); } }); this.setBackground(Color.WHITE); this.add(showDate, BorderLayout.CENTER); this.setPreferredSize(new Dimension(90, 25)); this.setBorder(BorderFactory.createLineBorder(Color.GRAY)); showDate.addMouseListener(new MouseAdapter() { public void mouseEntered(MouseEvent me) { if (showDate.isEnabled()) { showDate.setCursor(new Cursor(Cursor.HAND_CURSOR)); showDate.setForeground(Color.RED); } } public void mouseExited(MouseEvent me) { if (showDate.isEnabled()) { showDate.setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); showDate.setForeground(Color.BLACK);
} } public void mousePressed(MouseEvent me) { if (showDate.isEnabled()) { showDate.setForeground(Color.CYAN); if (isShow) {
hidePanel();
} else {
showPanel(showDate);
} } } public void mouseReleased(MouseEvent me) { if (showDate.isEnabled()) { showDate.setForeground(Color.BLACK); } } }); showDate.addFocusListener(new FocusListener() { public void focusLost(FocusEvent e) { hidePanel(); } public void focusGained(FocusEvent e) { } }); } // 隐藏选择面板 private void hidePanel() { if (pop != null) { isShow = false; pop.hide(); pop = null; } } // 显示选择面板 private void showPanel(Component owner) { if (pop != null) { pop.hide(); } Point show = new Point(0, showDate.getHeight()); SwingUtilities.convertPointToScreen(show, showDate); Dimension size = Toolkit.getDefaultToolkit().getScreenSize(); int x = show.x; int y = show.y; if (x < 0) { x = 0; } if (x > size.width - 175) { x = size.width - 175; } if (y < size.height - 170) { } else { y -= 188; } pop = PopupFactory.getSharedInstance().getPopup(owner, TextPanel, x, y); pop.show(); isShow = true; }
public static void main(String[] args) { TextModel dateChooser1 = new TextModel(); TextModel dateChooser2 = new TextModel(); JTextField showDate1 = new JTextField("单击选择"); JLabel showDate2 = new JLabel("单击选择"); dateChooser1.register(showDate1); dateChooser2.register(showDate2); JFrame jf = new JFrame("测试选择器"); jf.getContentPane().add(showDate1, BorderLayout.NORTH); jf.getContentPane().add(showDate2, BorderLayout.SOUTH); jf.pack(); jf.setLocationRelativeTo(null); jf.setVisible(true); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }}