Java 声明JFrame变量的最佳位置

Java 声明JFrame变量的最佳位置,java,swing,jframe,jpanel,Java,Swing,Jframe,Jpanel,我正在用一系列不同的接口编写一个程序。每个接口都存储在扩展JPanel的单独类中,为了在接口之间交换,我将JFrame的内容窗格设置为所需的JPanel 所以我的问题是:在哪里最好地声明JFrame?它应该在一个完全独立的类中吗?它应该在包含要加载的第一个接口的类中吗?我应该创建一个扩展JFrame的新类吗?有什么我应该遵守的惯例吗?将JFrame作为参数传递给每个面板似乎有点过分。提前谢谢。我会用这样的方法 使用可能的接口声明枚举: public enum PossibleInterfaces

我正在用一系列不同的接口编写一个程序。每个接口都存储在扩展JPanel的单独类中,为了在接口之间交换,我将JFrame的内容窗格设置为所需的JPanel


所以我的问题是:在哪里最好地声明JFrame?它应该在一个完全独立的类中吗?它应该在包含要加载的第一个接口的类中吗?我应该创建一个扩展JFrame的新类吗?有什么我应该遵守的惯例吗?将JFrame作为参数传递给每个面板似乎有点过分。提前谢谢。

我会用这样的方法

使用可能的接口声明枚举:

public enum PossibleInterfacesEnum {
    INTERFACE_1 {
        public javax.swing.JPanel getInstance() {
            return new javax.swing.JPanel();
        }
    },
    INTERFACE_2 {
        public javax.swing.JPanel getInstance() { 
            return new javax.swing.JPanel();
        }
    };

    public abstract javax.swing.JPanel getInstance();
}
然后,我将创建一个类来管理我的框架,如下所示:

public class MyFrameManager {

    private JFrame     frame;
    private CardLayout frameLayout;

    public MyFrameManager() {
        super();
        frame = new JFrame("My App");
        frame.setLayout(frameLayout = new CardLayout());
        frame.setSize(320, 240);

        // Adding to the layout all possible interfaces, each referenced by its name
        for (PossibleInterfacesEnum e : PossibleInterfacesEnum.values()) {
            frameLayout.addLayoutComponent(e.getInstance(), e.name());
        }

    }

    public void showInterface(PossibleInterfacesEnum e) {
        frameLayout.show(frame.getContentPane(), e.name());
        if (!frame.isVisible()) {
            frame.setVisible(true);
        }
    }
}
最后,从我的应用程序中,我将使用我的框架管理器,指示我要显示的界面:

public class MyApp {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                MyFrameManager f = new MyFrameManager();
                f.showInterface(PossibleInterfacesEnum.INTERFACE_1);
            }
        });
    }
}
我希望这对你有用


关于,

“我设置了JFrame的内容窗格”这是错误的方法。创建
JPanel
。给它一个
卡片布局
。将该面板添加到框架(或小程序、窗口或对话框…)并显示它。使用卡片布局在视图之间切换。好的,谢谢,这看起来确实是一个更好的方法:),但仍然存在类似的问题。是否有使用CardLayout声明面板的常规位置?只是出于兴趣,为什么设置新的内容窗格是错误的方法?是出于性能原因,还是卡布局更为传统?