【问题标题】:Java Swing: Cannot Edit JComponents in JWindow ExtensionJava Swing:无法在 JWindow 扩展中编辑 JComponent
【发布时间】:2011-09-15 07:59:04
【问题描述】:

我编写了一个扩展JWindow 的类,它在我的应用程序中充当一种可自定义的对话框。当我需要调用其中一个窗口时,我会创建一个新的类实例;要移除窗口,我调用方法 dispose()。

我遇到的问题是用户无法编辑具有文本框的组件,例如JTextFieldJSpinner。用户可以点击drop-down boxesbuttons等组件,效果很好,但是在文本框中输入文本时就不行了。

有没有其他人遇到过这个问题?

谢谢!

【问题讨论】:

  • 您必须向我们展示一些代码才能获得一些有用的帮助!通常,使用JTextField(或JSpinner 或其他)可以与JWindow 一起使用,也可以与任何其他顶级容器一起使用。所以你的代码中一定有一些事情会阻止这些组件正常工作。

标签: java swing user-interface


【解决方案1】:

在窗口子可以接收焦点之前,需要满足很多条件,请参阅 window.isFocusableWindow() 的 api 文档。

对于大多数情况,将其 focusableWindowState 属性设置为 true 就足够了,例如

    JFrame owner = new JFrame();
    owner.setVisible(true);
    JWindow window = new JWindow(owner);
    window.setFocusableWindowState(true);
    window.add(new JTextField("edit me"));
    window.setSize(200, 200);
    window.setVisible(true);

【讨论】:

  • +1 但是,我从来不用setFocusableWindowState()。我只是指定一个可见的 JFrame 作为所有者,它对我有用。还有其他我不知道的问题吗?
  • 做了一些测试,发现可聚焦窗口状态的默认值为true。将其设置为 false 将关闭可聚焦性,但将其设置为 true 并不能保证可聚焦性。你仍然需要确保窗口有一个可见的所有者 JFrame。
  • @camickr - 你是对的,只要所有者可见,删除 setFocusableWindowState 调用就会产生相同的结果。看来我的记忆是..不正确。感谢您检查:-)
【解决方案2】:

1) 也许您正在将 AWT 与 Swing drop-down box and button 混合使用,您确定所有 Components 定义都以 Jdrop-down boxes == JComboBoxButton == JButton 等开头

2) 不要在Fly/Runtinme 上创建大量Top-Level Containers

3) Has anyone else experienced this problem? 不,永远不会

4) 尽快获得真正和更好的帮助,请编辑您的帖子并在此处发送用于证明您的问题的代码是简单的规则 sscce

【讨论】:

  • 我今天早上看到了类似的 JDialog,可能相关吗?问题是在 setVisible 返回后运行任务需要几秒钟。这个暂停(在 setVisible 返回后立即)似乎搞砸了焦点代码,当我下次启动 JDialog 时,文本字段不可点击,但按钮有效。点击选项卡向我显示焦点仍在底层父窗口中,而不是新的 JPanel。听起来很相似。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-07
  • 2011-05-09
  • 1970-01-01
  • 2014-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多