【发布时间】:2021-12-18 04:38:09
【问题描述】:
面临以下情况。我在 JCombobox 中有一个项目列表。更改组合框中的行会导致从 ItemListener 接口调用我的 itemStateChanged 方法。这是正确的。但是在这里我需要询问用户他/她是否确定这一点,因为他/她更改了旧项目中的某些内容,并且保存这些更改会很好(或者不,因为这是一个意外错误,或者不是完全离开旧项目)。我超越了一个简单的 JOptionPane.showQuestionMessage 并构建了我自己的复杂对话框。具有不同的字段、树、表格和其他,允许用户在“是”、“否”和“取消”之间做出明智的选择。这里是伏击!
pack() 和 setVisible(true) 之后的对话框打开但没有获得焦点!焦点仍在组合框上,其中当前行已更改。可能这也是正确的,因为在确认并可能保存更改后,应该让用户有机会继续单击项目。
是否可以在不影响下拉列表的情况下调用模态对话框窗口?
即使我们接受combo box失去焦点并关闭其中的下拉列表,那么setVisible(true)之后如何将焦点转移到对话框?在 dialog.setVisible (true) 之前使用 dialog.requestFocus 没有帮助。现在必须单击“是”按钮两次。第一次单击是转移焦点,第二次是按下按钮本身。
还是我错过了一些简单的东西?如有任何建议,我将不胜感激!
【问题讨论】:
-
1) 确保您使用的是“模态”对话框。 2) 如果这不起作用,则将创建对话框的代码包装在
SwingUtilities.invokeLater()中。这将允许下拉菜单在显示对话框之前关闭,以便对话框保持焦点。 -
@camickr 似乎我没有足够的声誉来标记解决方案。事实上,在 SwingUtilities.invokeLater() 中插入创建模式对话框解决了焦点问题。
标签: java swing dialog focus event-listener