gpt4 book ai didi

java - Swing 焦点问题,失去焦点,未调用 focusgain

转载 作者:搜寻专家 更新时间:2023-11-01 03:08:19 26 4
gpt4 key购买 nike

我有一个复杂而繁重的 swing 客户端应用程序,其中包含许多模式组件、jdialog、内部框架等。在某些情况下,出现问题并且无法再专注于 swing 文本字段。您可以单击一些 jbuttons、jcheckboxes,但不可能再在可编辑的 jtextfields 上聚焦和编辑值。不再触发可编辑文本字段的 gainfocus 事件,当您单击文本字段时,只会调用 requestfocus 方法。我找到了一种方法(hack)来解决问题,当问题发生时,你会显示一些 joptionpane 消息或 modal jdialog 并通过单击或处理将其关闭,问题消失了,您可以单击文本字段并进行编辑。作为解决方案,我做了一些检查,如果您尝试专注于一个组件,我会在单击的文本字段的 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方法有很多synchronized blocks, mutex objects等,我觉得会出现一些死锁。

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

最佳答案

You may click on some jbuttons, jcheckboxes but it is impossible to focus and edit values on editable jtextfields anymore.

  • 这是 JWindow 中的 JTextField 的问题(很常见),没有父级 (JFrame),请使用未修饰的 JDialog 代替

  • 我在这里看到 FocusFocusSubsystem 上的 Linux OS 和最新的 Java 版本 存在一些问题,但从未阻止用户输入 JTextField

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

  • dialog.setVisible(true); 应该包裹在 invokeLater() 中,更多见 Initial Thread (valid for all Top-Level Containers created on runtime too)

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

关于java - Swing 焦点问题,失去焦点,未调用 focusgain,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14932726/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com