代码之家  ›  专栏  ›  技术社区  ›  stolsvik

阻止整个swing ui,除了一个组件-“对话框样式”

  •  1
  • stolsvik  · 技术社区  · 16 年前

    [这个问题与 this question ]

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

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

    4 回复  |  直到 9 年前
        1
  •  2
  •   Ishtar    16 年前

    玻璃窗可能是最好的选择。您可以轻松地窃取所有事件并将其发送到自定义对象。下面是一篇讨论如何实现 A wellbehaved glasspane .

        2
  •  1
  •   Erick Robertson    16 年前

    • EditableLabelListener 定义方法的接口 editableStateChanged(EditableLabelEvent)

    • 创建 EditableLabelEvent 扩展的类 AWTEvent editableState 财产和财产 isEditable() 布尔值。

    • 为自定义组件添加方法 addEditableLabelListener removeEditableLabelListener

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

    • 当触发事件时,控制器类应该检查 isEditable 方法,并根据需要启用或禁用面板上的所有其他组件。当同一窗体上有多个可编辑标签组件时,可以使用 getSource

        3
  •  1
  •   Denis Tulskiy    16 年前

    在可编辑标签中,开始编辑时,使用 SwingUtilities.getRoot() 要找到标签的根,请将其投射到 Container getComponents() . 遍历此数组并调用 setEnabled(false)

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

        4
  •  0
  •   Andrew Sunil Kumar B M    16 年前

    您可以扩展JDialog,然后在初始化它时,

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

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