0

- - - - - - 编辑 - - - - - - - -

问题:我写了一个JTextField,它有一个弹出窗口。这个弹出窗口是一个未装饰的JFrame。由于代码已经由其他人编写,现在我想实现如下:

1.当弹窗失去焦点时,关闭弹窗。

2.当使用点击JTextField时,如果弹出窗口打开,关闭弹出窗口,否则打开弹出窗口。

如何实施?

以下是我的尝试,但存在冲突。


首先,我有一个带有 MouseListener 的 JTextField,用于触发 JFrame 弹出窗口。

      public void mousePressed(MouseEvent arg0) {
            if (TextField.this.isEnabled() && !popup.isVisible() && TextField.this.isEditable())
                open();
            else if (popup.isVisible()) {
                popup.setVisible(false);
            }
        }

我将 windowfocuslistener 添加到 JFrame(popup) 以确保当焦点丢失时它可以关闭。如下所示:

       popup.addWindowFocusListener(new WindowFocusListener() {

             @Override
             public void windowLostFocus(WindowEvent e) {
                    popup.setVisible(false);
             }
       }

所以问题来了,当我第一次点击 JTextField 时,它会打开日期弹出窗口,当我再次点击 JTextField 时,它会首先调用 windowlostfocus 来设置可见(假)。然后鼠标监听,将打开日期弹出窗口。这不是我的想法,我想在再次单击时关闭弹出窗口。有人有想法避免这种情况吗?谢谢你的帮助。

4

1 回答 1

0

您应该遵循已经为系统定义的行为。例如,在 Windows 上,右击打开弹出窗口,左击关闭。重新打开弹出窗口以再次右键单击不是错误,这是此处的默认行为。如果不手动实现,则最容易实现有关系统指南的正确行为。下面是一个以符合系统的方式自动打开和关闭的弹出窗口示例。

弹出窗口显示一个颜色选择器,允许更改文本字段的背景。请注意,如果您不手动操作,一切都会变得多么容易。如果用户按下键盘上的键,弹出窗口也会打开Menu,这是您可能没有想到的。

使用其他人已经为您完成的...</p>

import java.awt.BorderLayout;
import java.beans.EventHandler;

import javax.swing.*;
import javax.swing.event.ChangeListener;

public class Popups {
  public static void main(String[] args) {
    JFrame f=new JFrame("popup");
    JTextField tf = new JTextField(30);
    JPopupMenu popup = new JPopupMenu();
    JColorChooser cc = new JColorChooser();
    cc.getSelectionModel().addChangeListener(EventHandler.create(
        ChangeListener.class, tf, "background", "source.selectedColor"));
    popup.add(cc);
    tf.setComponentPopupMenu(popup);
    f.getContentPane().add(tf, BorderLayout.NORTH);
    f.pack();
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setVisible(true);
  }
  static {
    try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); }
    catch(ClassNotFoundException | InstantiationException
        | IllegalAccessException | UnsupportedLookAndFeelException ex) {
      // if this fails life with the default L&F
    }
  }
}
于 2013-10-24T07:58:03.387 回答