4

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

KeyboardManager.getCurrentKeyboardFocusManager().getPermanentFocusOwner()

如果没有出现问题,并且文本字段获得焦点,则返回的对象(getPermanentFocusOwner 的返回值)与焦点请求组件的实例相同。但是,如果发生有问题的情况,返回的对象与请求焦点的对象不同,我通过以下方式打开我的临时 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 方法有很多同步块、互斥对象等,我认为会出现一些死锁。

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

4

1 回答 1

3

您可以单击一些 jbuttons、jcheckboxes,但不可能再在可编辑的 jtextfields 上聚焦和编辑值。

  • JTextField这是inJWindow没有父级 ( )的问题(很常见) ,请改用JFrameundecoratedJDialog

  • 我在这里看到了一些问题Focus,最后一个,但从未导致阻止用户输入到 JTextFieldFocusSubsystemLinux OSJava version

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

  • dialog.setVisible(true);应该包含在 中invokeLater(),更多请参见Initial Thread(也适用于在运行时创建的所有顶级容器)

  • 如果没有发布SSCCE,您的问题就不清楚了,简短,可运行,可编译,演示,由 am 问题引起

于 2013-02-18T09:49:14.947 回答