我用Popup弹出一个窗口Jpanel,上面加了一个JtextArea。但是点击标签后,弹出来的窗口,是无法获取焦点的,就是text不能辩解,请问,各位大佬,怎么解决,这个问题呢,或者说,怎么实现这样的弹窗。谢谢

解决方案 »

  1.   

    代码如下:
    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); }}