我有一个复杂而繁重的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方法有很多同步块,互斥对象等,我认为会出现一些死锁。
任何更好的机制建议,想法?我知道最好的解决方案是检查当前的应用程序,分析它或重写它。但它非常复杂,沉重,模型和视图组织得不好。我的时间很短,因为客户正在等待,需要一些暂时的解决方案,技巧或黑客攻击。
答案 0 :(得分:3)
你可以点击一些jbuttons,jcheckbox,但是不可能 在可编辑的jtextfields上聚焦和编辑值。
JTextField
中没有父母JWindow
)JFrame
的问题(非常常见),请使用未修饰的JDialog
代替
我在这里看到Focus
上的FocusSubsystem
,Linux OS
上有Java version
的问题,但从未导致阻止用户输入JTextField
a.m.问题的最佳解决方法是@camickr
dialog.setVisible(true);
应该包含在invokeLater()
中,更多信息请参见Initial Thread (valid for all Top-Level Containers created on runtime too)
在没有发布SSCCE,简短,可运行,可编辑,已证明的问题的情况下,没有任何明确的问题