Java 阻止除一个组件“对话框样式”之外的整个swing ui

Java 阻止除一个组件“对话框样式”之外的整个swing ui,java,swing,user-interface,jdialog,glasspane,Java,Swing,User Interface,Jdialog,Glasspane,[此问题涉及] 设置:我有一个自制的可编辑标签组件,看起来像一个标签,但当你点击它时,它会变成一个可编辑字段,允许你编辑它。可以按Esc键取消编辑,或按住Shift键Enter键确定编辑,或单击“可编辑”字段下的相应按钮 挑战:当你进入这个编辑模式时,我希望用户界面的其余部分被完全屏蔽:你要么取消编辑,要么确定编辑,然后才能做其他事情。写这篇文章的时候,我意识到了一个显而易见的事实:这正是一个对话框的运作方式——但我更喜欢我的文档内编辑标签,而不是打开一个对话框。这很粗糙。Swing中没有方法阻

[此问题涉及]

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


挑战:当你进入这个编辑模式时,我希望用户界面的其余部分被完全屏蔽:你要么取消编辑,要么确定编辑,然后才能做其他事情。写这篇文章的时候,我意识到了一个显而易见的事实:这正是一个对话框的运作方式——但我更喜欢我的文档内编辑标签,而不是打开一个对话框。

这很粗糙。Swing中没有方法阻止除一个组件之外的所有UI。这是你必须自己去做的事情。以下是我将使用的设计方法:

构建EditableLabelListener接口,定义EditableStateChangedItableLabelEvent方法

创建一个EditableLabeleEvent类,该类扩展awteEvent并添加editableState属性和isEditable布尔值

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

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

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


这很粗糙。Swing中没有方法阻止除一个组件之外的所有UI。这是你必须自己去做的事情。以下是我将使用的设计方法:

构建EditableLabelListener接口,定义EditableStateChangedItableLabelEvent方法

创建一个EditableLabeleEvent类,该类扩展awteEvent并添加editableState属性和isEditable布尔值

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

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

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


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

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

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

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

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

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

玻璃窗格可能是一种方法。您可以轻松地窃取所有事件并将其发送到自定义对象。这里有一篇文章讨论了一种实现方法。

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

在可编辑标签中,开始编辑时,使用SwingUtilities.getRoot获取标签的根,将其强制转换为容器。在容器上,可以调用getComponents。迭代此数组并调用setEnabledfalse,除非它是标签。完成编辑后启用它们

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


顺便说一句,如果从JTextField和setOpaquefalse中删除边框,它将与可编辑标签一样。

在可编辑标签中,开始编辑时,使用SwingUtilities.getRoot获取标签的根,将其强制转换到容器中。在容器上,可以调用getComponents。迭代此数组并调用setEnabledfalse,除非它是标签。完成编辑后启用它们

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


顺便说一句,如果从JTextField和setOpaquefalse中删除边框,它将作为一个可编辑的标签。

我突然想到,玻璃窗格和JXLayer可以吸收事件。因此,如果我使用玻璃窗格或JXLayer在某个白色层上打一个可视孔,以完成链接到相关问题的白色部分,我可以简单地同时不让事件通过白色部分-仅在打孔部分..我突然想到玻璃窗格和JXLayer可以吸收事件。所以如果我用玻璃窗或JXL 为了在某个白色层上打一个可视孔来进行与相关问题相关的涂白,我可以简单地同时不让事件通过白色部分-仅在打掉的部分。。