在java-swing应用程序中,我有一个带有某种帮助弹出窗口的文本字段 即,当用户在文本字段中双击鼠标时,显示该弹出窗口(实现为未修饰的JFrame)。
一旦文本字段失去焦点,此弹出窗口就会再次隐藏 问题是显示此弹出窗口时,焦点会自动移动到该帧,在文本字段上触发lostFocus事件。这当然会再次关闭弹出窗口。
我希望只有当textfield将焦点丢失到同一窗口中的另一个组件时才会触发lostFocus事件。
知道怎么做到这一点吗?
答案 0 :(得分:1)
解决方案比我想象的更容易:
在focusLost
回调中,检查isTemporary()
标记
如果设置,请忽略该事件。
更新:
如果设置了ifTemporary()
标志,请确定获得焦点的组件(通过getOppositeComponent()
)。
如果该组件null
或其父窗口不是我们的弹出框架,那么无论如何关闭弹出窗口。
答案 1 :(得分:0)
检查哪个对象已获得焦点并根据它隐藏窗口。
这是一个粗略的例子
public class MainFrame extends JFrame {
private JWindow popupWindow;
public MainFrame() throws HeadlessException {
super("Main Frame");
createGUI();
}
private void createGUI() {
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setPreferredSize(new Dimension(600, 400));
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS));
JTextField hintTextField = new JTextField();
popupWindow = new JWindow(this);
popupWindow.getRootPane().setBorder(BorderFactory.createLineBorder(Color.RED));
popupWindow.getRootPane().setLayout(new BorderLayout());
popupWindow.getRootPane().add(hintTextField, BorderLayout.CENTER);
for(int i = 0; i < 10; i++) {
JTextField textField = new JTextField();
textField.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if(e.getClickCount() == 2) {
Point point = textField.getLocationOnScreen();
popupWindow.setBounds(point.x, point.y + textField.getPreferredSize().height, 200, 200);
popupWindow.setVisible(true);
}
}
});
textField.addFocusListener(new FocusAdapter() {
@Override
public void focusLost(FocusEvent e) {
if(e.getOppositeComponent() != hintTextField) {
popupWindow.setVisible(false);
}
}
});
panel.add(textField);
}
add(panel, BorderLayout.PAGE_START);
pack();
setLocationRelativeTo(null);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new MainFrame().setVisible(true));
}
}