我有一个复杂而繁重的swing客户端应用程序,其中包含许多模态组件,jdialogs,内部框架等.在某些情况下,出现问题并且不可能再关注swing文本字段.您可以单击某些jbuttons,jcheckbox,但不可能在可编辑的jtextfields上聚焦和编辑值.不会触发可编辑文本字段的gainfocus事件,只有在执行文本字段单击时才会调用requestfocus方法.
我发现了一种方法(黑客)所以解决有问题的情况,当故障情况发生时,你显示一些joptionpane消息或模态jdialog并通过点击或处理关闭它,问题消失你可以点击文本字段并编辑它们.
作为一个解决方案,我做了一些检查,如果你尝试专注于一个组件,我在clicked textfield的requestfocus事件中启动一个计时器线程,并将实例保持为focusrequesting组件.一段时间后,我检查最后一个焦点组件
KeyboardManager.getCurrentKeyboardFocusManager().getPermanentFocusOwner()
如果没有问题,并且文本字段获得焦点,则返回的对象(getPermanentFocusOwner的返回值)与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方法有很多同步块,互斥对象等,我认为会出现一些死锁.
有没有更好的机制建议,想法?我知道最好的解决方案是检查当前的应用程序,分析它或重写它.但它非常复杂,沉重,模型和视图组织得不好.我的时间很短,因为客户正在等待,需要一些暂时的解决方案,技巧或黑客.
解决方法:
You may click on some jbuttons, jcheckboxes but it is impossible to
focus and edit values on editable jtextfields anymore.
>这是JWxtow中没有父级(JFrame)的JTextField的问题(非常常见),请使用未修饰的JDialog代替
>我在这里看到了有关最新Java版本的Linux OS上的Focus,FocusSubsystem的一些问题,但从未导致阻止用户输入JTextField
> @camickr对于a.m.问题的最佳解决方法是RequestFocusListener
> dialog.setVisible(true);应该包装在invokeLater()中,更多信息请参见Initial Thread (valid for all Top-Level Containers created on runtime too)
>没有发布一个SSCCE,简短,可运行,可编译,演示,由于问题引起的问题