------------ ---------------编辑
问题:我编写了一个带有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。这不是我的想法,我想再次点击时关闭弹出窗口。 有人有想法避免这种情况吗? 谢谢你的帮助。
答案 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
}
}
}