Java 使JFrame为只读

Java 使JFrame为只读,java,swing,jframe,Java,Swing,Jframe,是否有任何方法可以将JFrame转换为只读,类似于Collections.unmodifiableList() 我需要将它作为参数传递给许多类,但我不希望它们关闭窗口或执行除咨询以外的任何操作。此外,我还需要一些自定义方法可用(因为我正在扩展JFrame) (我不是说禁用所有组件,我是说如果有对象引用,就不能在该对象上写入内容)。可能的解决方案: 使其持有的组件为“只读”,一种方法是使它们各自不可聚焦 我想您可以递归地遍历容器/组件树,使所有组件都不可聚焦 用玻璃窗格覆盖JFrame,以阻止用户

是否有任何方法可以将JFrame转换为只读,类似于
Collections.unmodifiableList()

我需要将它作为参数传递给许多类,但我不希望它们关闭窗口或执行除咨询以外的任何操作。此外,我还需要一些自定义方法可用(因为我正在扩展JFrame)

(我不是说禁用所有组件,我是说如果有对象引用,就不能在该对象上写入内容)。

可能的解决方案:

  • 使其持有的组件为“只读”,一种方法是使它们各自不可聚焦
  • 我想您可以递归地遍历容器/组件树,使所有组件都不可聚焦
  • 用玻璃窗格覆盖JFrame,以阻止用户输入

  • 作为附带建议:

    此外,我还需要一些自定义方法可用(因为我正在扩展JFrame)

    通过让类扩展JFrame,您可能会陷入困境,迫使您创建和显示JFrame,而这通常需要更大的灵活性。事实上,我敢说,我创建的大多数Swing GUI代码和我看到的大多数Swing GUI代码都没有扩展JFrame,事实上,很少有人愿意这样做。更常见的是,您的GUI类将面向创建JPanel,然后可以将JPanel放入JFrames或JDialogs或JTabbedPanes中,或者在需要时通过CardLayouts进行交换。这将大大提高GUI编码的灵活性

    可能的解决方案:

  • 使其持有的组件为“只读”,一种方法是使它们各自不可聚焦
  • 我想您可以递归地遍历容器/组件树,使所有组件都不可聚焦
  • 用玻璃窗格覆盖JFrame,以阻止用户输入

  • 作为附带建议:

    此外,我还需要一些自定义方法可用(因为我正在扩展JFrame)


    通过让类扩展JFrame,您可能会陷入困境,迫使您创建和显示JFrame,而这通常需要更大的灵活性。事实上,我敢说,我创建的大多数Swing GUI代码和我看到的大多数Swing GUI代码都没有扩展JFrame,事实上,很少有人愿意这样做。更常见的是,您的GUI类将面向创建JPanel,然后可以将JPanel放入JFrames或JDialogs或JTabbedPanes中,或者在需要时通过CardLayouts进行交换。这将大大提高GUI编码的灵活性

    不,没有办法。正确的解决方案是根本不扩展JFrame。一般来说,您永远不应该扩展组件类来完成您仅仅通过调用它们的公共方法就可以完成的事情;像JFrame这样的车型的常规使用并不能构成新的JFrame类型,正如将不同的人放在大众汽车上一样,也不能将其视为新的车型

    相反,您应该将JFrame包装在一个不扩展任何†的类中,并在其中隐藏JFrame。然后,您只能公开要公开的方法:

    public class MyAppWindow {
        private final JFrame frame;
    
        private final JComponent frameContents;
    
        public MyAppWindow() {
            this.frame = new JFrame("My App");
            this.frameContents = new JPanel();
            // Set up frameContents here...
        }
    
        public void show() {
            frame.setVisible(true);
        }
    
        public void hide() {
            frame.setVisible(false);
        }
    
        public void addField(Component field,
                             String labelText) {
    
            JLabel label = new JLabel(labelText);
            label.setLabelFor(field);
    
            // Create layout constraints for label here...
    
            frameContents.add(label, constraints);
    
            // Create layout constraints for field here...
    
            frameContents.add(field, constraints);
        }
    }
    

    †从技术上讲,没有
    扩展
    子句的类将从Object继承。

    不,没有办法这样做。正确的解决方案是根本不扩展JFrame。一般来说,您永远不应该扩展组件类来完成您仅仅通过调用它们的公共方法就可以完成的事情;像JFrame这样的车型的常规使用并不能构成新的JFrame类型,正如将不同的人放在大众汽车上一样,也不能将其视为新的车型

    相反,您应该将JFrame包装在一个不扩展任何†的类中,并在其中隐藏JFrame。然后,您只能公开要公开的方法:

    public class MyAppWindow {
        private final JFrame frame;
    
        private final JComponent frameContents;
    
        public MyAppWindow() {
            this.frame = new JFrame("My App");
            this.frameContents = new JPanel();
            // Set up frameContents here...
        }
    
        public void show() {
            frame.setVisible(true);
        }
    
        public void hide() {
            frame.setVisible(false);
        }
    
        public void addField(Component field,
                             String labelText) {
    
            JLabel label = new JLabel(labelText);
            label.setLabelFor(field);
    
            // Create layout constraints for label here...
    
            frameContents.add(label, constraints);
    
            // Create layout constraints for field here...
    
            frameContents.add(field, constraints);
        }
    }
    

    †从技术上讲,没有
    扩展
    子句的类将从Object继承。

    我想我没有解释清楚。我的意思是,如果其他类有对JFrame的引用,那么它们就不能做任何事情,而不是禁用组件。我不是在JFrame上画画,我只是有一些方法可以访问一些数据。@Germanán:对不起,我不太理解你上面贴的内容。你能多告诉我一些你问题的细节吗。也可以考虑编辑你的问题,并将重要的信息添加到问题中,这样其他可能给出好答案的人可以阅读并完全理解你的问题。我的意思是把对象转换成只读,这样你就不能调用Debug()了,例如,如果你有对象的引用。类似于
    Collections.unmodifiableList()
    。我想我没有解释清楚。我的意思是,如果其他类有对JFrame的引用,那么它们就不能做任何事情,而不是禁用组件。我不是在JFrame上画画,我只是有一些方法可以访问一些数据。@Germanán:对不起,我不太理解你上面贴的内容。你能多告诉我一些你问题的细节吗。也可以考虑编辑你的问题,并将重要的信息添加到问题中,这样其他可能给出好答案的人可以阅读并完全理解你的问题。我的意思是把对象转换成只读,这样你就不能调用Debug()了,例如,如果你有对象的引用。类似于
    Collections.unmodifiableList()
    。为什么不能重写不希望调用的方法并使它们抛出异常?@cricket\u 007,因为它是一个JFrame。它有很多方法,我不知道你为什么想要这个。您是否将GUI作为不希望外部用户修改的软件包的一部分提供?@cricket_007不,这只是设计问题。这是一个窗口,里面有一些组件需要读取有关它的信息,但我不希望他们(或我提供参考的任何人)在上面做事情,而是读取。创建一个GUI模型,保存JFrame上显示的值。将GUI模型的实例传递给应用程序中需要该信息的任何部分