我有一个复杂而繁重的摇摆客户端应用程序,其中包含许多模态组件、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 方法有很多同步块、互斥对象等,我认为会出现一些死锁。
有更好的机制建议和想法吗?我知道最好的解决方案是检查当前的应用程序,分析它或重写它。但它非常复杂、沉重,模型和视图组织得不好。我的时间很短,因为客户正在等待,需要一些临时解决方案、技巧或技巧。