将JFrame设为只读

时间:2016-04-17 17:08:20

标签: java swing jframe

有没有办法将JFrame转换为只读,类似于Collections.unmodifiableList()

我需要将它作为参数传递给许多类,但我不希望它们关闭窗口或做任何事情而不是咨询。另外我需要一些自定义方法(因为我正在扩展JFrame)。

(我并不是说禁用所有组件,我的意思是如果您对该对象有参考,则无法在该对象上写入。)

2 个答案:

答案 0 :(得分:3)

不,没有办法做到这一点。正确的解决方案根本不是扩展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);
    }
}

从技术上讲,没有extends子句的类将继承自Object。

答案 1 :(得分:1)

可能的解决方案:

  1. 制作它所拥有的组件"只读",通过使它们全部单独不可聚焦的一种方式。
  2. 我想你可以递归遍历容器/组件树,使所有不可聚焦的
  3. 使用阻止用户输入的玻璃板覆盖JFrame。
  4. 作为附带建议:

      

    另外我需要一些自定义方法(因为我正在扩展JFrame)。

    当你的类扩展JFrame时,你可能会在角落里画画,迫使你创建和显示JFrame,这通常需要更多的灵活性。事实上,我冒昧地说,我已经创建的大部分Swing GUI代码都是扩展JFrame,事实上你很少&#39 ;我会想要这样做。更常见的是,您的GUI类将面向创建JPanels,然后可以将其放置到JFrames或JDialogs或JTabbedPanes中,或者在需要时通过CardLayouts交换。这将大大提高GUI编码的灵活性。