阻止整个摆动ui除了一个组件 - “对话式”

时间:2010-08-30 11:44:27

标签: java swing user-interface jdialog glasspane

[此问题与this question]

有关

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

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

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

  • 构建定义方法EditableLabelListener

  • editableStateChanged(EditableLabelEvent)界面
  • 创建一个扩展EditableLabelEvent的{​​{1}}类,并添加AWTEvent属性和editableState布尔值。

  • isEditable()addEditableLabelListener

  • 的自定义组件添加方法
  • 在使用组件的每个面板上,让控制器类(可能是您的面板,具体取决于您的设计)实现removeEditableLabelListener并将自己注册为组件的监听器。

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

答案 2 :(得分:1)

在您的可编辑标签中,当您开始编辑时,使用SwingUtilities.getRoot()获取标签的根,将其转换为Container。在容器上,您可以拨打getComponents()。迭代此数组并调用setEnabled(false),除非它是标签。完成编辑后启用它们。

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

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

答案 3 :(得分:0)

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

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

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