Java 摆动焦点问题、焦点丢失、未调用焦点增益

Java 摆动焦点问题、焦点丢失、未调用焦点增益,java,swing,focus,jdialog,Java,Swing,Focus,Jdialog,我有一个复杂而繁重的swing客户端应用程序,其中包含许多模态组件、jdialogs、内部框架等。在某些情况下,会出现问题,无法再关注swing文本字段。您可以单击某些jbutton、jcheckbox,但不可能再在可编辑的jtextfields上聚焦和编辑值。可编辑文本字段的gainfocus事件不再触发,当您执行单击文本字段时,只调用requestfocus方法。 我找到了一种解决问题的方法(hack),当出现问题时,您显示一些joptionpane消息或模态jdialog并通过单击或处理来

我有一个复杂而繁重的swing客户端应用程序,其中包含许多模态组件、jdialogs、内部框架等。在某些情况下,会出现问题,无法再关注swing文本字段。您可以单击某些jbutton、jcheckbox,但不可能再在可编辑的jtextfields上聚焦和编辑值。可编辑文本字段的gainfocus事件不再触发,当您执行单击文本字段时,只调用requestfocus方法。 我找到了一种解决问题的方法(hack),当出现问题时,您显示一些joptionpane消息或模态jdialog并通过单击或处理来关闭它,问题就会消失,您可以单击文本字段并编辑它们。 作为一个解决方案,我做了一些检查,如果您尝试关注一个组件,我会在clicked textfield的requestfocus事件中启动一个计时器线程,并将实例保持为focusrequesting组件。过了一段时间,我通过

KeyboardManager.getCurrentKeyboardFocusManager().getPermanentFocusOwner()

如果没有出现问题,并且textfield获得了焦点,则返回的对象(getPermanentFocusOwner的retur值)与focusrequesting组件的实例相同。但如果出现问题,则返回的对象与请求对象的焦点不同,我通过以下方式打开我的临时jdialog:

JDialog dialog=new OptionPane().createDialog(KeyboardFocusManager.getCurrentFocusManager().getActiveWindow(), "");
dialog.setModal(true); 
// MUST be modal to fix the lost focus case
// start closing thread, which closes the dialog after some few time by dialog.dispose
new Closer(dialog).start();
dialog.setVisible(true);
这个机制有效,我现在不太稳定。在某些情况下,dialog.dispose()不起作用,临时窗口始终保持在屏幕上,不可关闭,并且由于它是模态的,客户端无法再执行任何操作。对话框必须是模态的才能解决焦点问题,因为非模态对话框不能解决上面声明的焦点问题。jdialog的dispose方法有很多同步块、互斥对象等,我认为会出现一些死锁

有更好的机制建议、想法吗?我知道最好的解决方案是检查当前的应用程序,分析它或重写它。但它非常复杂、沉重,而且模型和视图没有很好地组织。我有很短的时间,因为客户正在等待,需要一些临时解决方案,技巧或黑客

您可以单击一些jbutton、jcheckbox,但不可能 在可编辑的jtextfields上聚焦和编辑值

  • 这是
    JTextField
    JWindow
    中没有父项(
    JFrame
    )时出现的问题(相当常见),请改用未修饰的
    JDialog

  • 我在这里看到了
    Focus
    Linux操作系统上的
    FocusSubsystem
    在最后一个
    Java版本上出现了一些问题,但从未导致阻止用户输入JTextField

  • 解决上午问题的最佳方法是通过
    @camickr

  • dialog.setVisible(true)应包装在
    invokeLater()
    中,更多信息请参见

  • 如果不发布一个简短的、可运行的、可编译的、可交易的、由上午问题引起的问题,您的问题中没有任何明确的内容