【问题标题】:Block entire swing ui except for one component - "dialog style"阻止除一个组件之外的整个 Swing ui - “对话框样式”
【发布时间】:2011-04-05 17:26:17
【问题描述】:

[这个问题与this question有关]

设置:我有这个自制的“可编辑标签”组件,它看起来像一个标签,但是当您单击它时,它会变成一个可编辑字段,允许您对其进行编辑。您可以按 Esc 取消,或按 Shift-Enter 确定您的编辑 - 或单击可编辑字段下方的相应按钮。

挑战:当您进入此编辑模式时,我希望 UI 的其余部分完全被阻止:您应该取消或确定编辑,然后才能执行其他任何操作。在写这篇文章时,我意识到很明显:这正是对话框的运作方式——但我更喜欢我的“文档内”编辑标签而不是打开对话框。

【问题讨论】:

  • Glass Pane 和 JXLayer 可以吸收事件让我很震惊。因此,如果我使用 Glass Pane 或 JXLayer 在某个白色层上打一个视觉孔以执行链接到相关问题所涉及的“白化”,我可以同时简单地不让事件在白色部分上通过 - 仅在“冲出”部分..

标签: java swing user-interface jdialog glasspane


【解决方案1】:

这很粗糙。 Swing 中没有任何方法可以阻止除一个组件之外的所有 UI。这是你必须自己建立的东西。这是我将使用的设计方法:

  • 构建一个EditableLabelListener接口,定义方法editableStateChanged(EditableLabelEvent)

  • 创建一个 EditableLabelEvent 类,该类扩展 AWTEvent 并添加一个 editableState 属性和一个 isEditable() 布尔值。

  • addEditableLabelListenerremoveEditableLabelListener 的自定义组件添加方法

  • 在您使用组件的每个面板上,让您的控制器类(可能是您的面板,取决于您的设计)实现 EditableEventListener 并将自己注册为组件的侦听器。

  • 触发事件时,控制器类应检查事件的isEditable 方法,并根据需要启用或禁用面板上的所有其他组件。当同一个表单上有多个可编辑的标签组件时,您可以在事件上使用getSource 方法来确定正在使用哪个,这样您就可以禁用其他的。

【讨论】:

    【解决方案2】:

    你可以扩展一个JDialog,然后当你初始化它时,

    this.setAlwaysOnTop(true);
    this.setModalityType(ModalityType.APPLICATION_MODAL);
    this.setVisible(false);
    this.setVisible(true);
    

    它只允许与 JDialog 交互并阻止应用程序中的所有其他内容。

    【讨论】:

      【解决方案3】:

      玻璃窗格可能是要走的路。您可以轻松窃取所有事件并将一些事件发送到您的自定义对象。这是一篇讨论实现A wellbehaved glasspane的方法的文章。

      【讨论】:

        【解决方案4】:

        在您可编辑的标签中,当您开始编辑时,使用SwingUtilities.getRoot() 获取标签的根,将其转换为Container。在 Container 上,您可以致电 getComponents()。遍历这个数组并调用setEnabled(false),除非它是标签。完成编辑后启用它们。

        一个问题:你为什么需要它?如果您需要类似对话框的行为,请使用JOptionPane

        顺便说一句,如果你从 JTextField 和 setOpaque(false) 中删除边框,它将只是一个可编辑的标签。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-22
          • 2023-01-07
          • 1970-01-01
          • 2019-11-24
          相关资源
          最近更新 更多