如何打开或关闭我喜欢的弹出窗口?

时间:2013-10-24 06:50:24

标签: java swing popup listener

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

问题:我编写了一个带有Popup的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.addWindowFocusListener(new WindowFocusListener() {

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

问题出现了,当我首先点击JTextField时,它会打开Date弹出窗口,当我再次单击JTextField时,它会首先调用windowlostfocus来设置setvisible(false)。然后mouselisten将打开Date Popup。这不是我的想法,我想再次点击时关闭弹出窗口。 有人有想法避免这种情况吗? 谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

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

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

使用别人已经为你做的事情......

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
    }
  }
}