[此问题与this question]
有关设置:我有这个自制的“可编辑标签”组件,看起来像一个标签,但是当你点击它时,它会变成一个可编辑的字段,允许你编辑它。您可以点击Esc取消,或按Shift-Enter确认您的修改 - 或点击可编辑字段下方的相应按钮。
挑战:当您进入此编辑模式时,我希望完全阻止UI的其余部分:您应该取消或完成编辑,然后才能执行任何其他操作。在写这篇文章时,我意识到显而易见:这正是一个对话框的运作方式 - 但我更喜欢我的“文档内”编辑标签,而不是打开一个对话框。
答案 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与应用程序进行交互并阻止其他所有内容。