Java Swing:将每个屏幕的 GUI 分成单独的文件/类

问题描述

我还是 Java Swing 的新手,我们一直在为一个班级学习它,我正在为一个小项目做这个。

所以这就是 GUI 在 1 个 java 文件中的样子[没有规范和设计]。但是,由于代码的长度,我的文件变得非常混乱,并且由于我无法在每个屏幕上再次使用相同的变量名,因此有很多不必要的变量名。我在学校学了 3 个月的 Java Swing,但现在才遇到这个问题。我想知道如何分离 GUI 文件(即 Screen1GUI.java、Screen2GUI.java、Screen3GUI.java,...)但遗憾的是,我们从未解决过它,而且我似乎找不到合适的词来搜索它在线。

public JlayeredPane layeredPane;
private JPanel Screen1,Screen2,Screen3;
private JButton switch1,switch2;

public MainGUI() {
    // other code

    Screen1 = new JPanel();
    // Screen1 GUI
    layeredPane.add(Screen1,"Screen 1");
    switch.addActionListener((ActionEvent a) -> {
       switchScreens(Screen2);
    });
    Screen1.add(switch1);

    Screen2 = new JPanel();
    // Screen2 GUI
    layeredPane.add(Screen2,"Screen 2");
    switch2.addActionListener((ActionEvent b) -> {
       switchScreens(Screen3);
    });
    Screen2.add(switch2);
    
    Screen3 = new JPanel();
    // Screen3 GUI
    layeredPane.add(Screen3,"Screen 3");
    
    cardlayout screens = (cardlayout) layeredPane.getLayout();
    screens.show(layeredPane,"Screen 1");

    // other code
}

public void switchScreens(JPanel screen) {
    layeredPane.removeAll();
    layeredPane.add(screen);
    layeredPane.repaint();
    layeredPane.revalidate();
}

解决方法

要将每个摆动对象分成自己的类,您应该能够简单地创建一个扩展 JPanel 的新类,例如

public class Screen1GUI extends JPanel {
    public Screen1GUI(){
        super();
    }
}

为了使其更有条理,您可以抽象类以考虑类似的属性,例如屏幕名称和切换按钮

public class Screen extends JPanel {
    
    private JButton switchButton;
    private String title;

    public Screen(){
        super();
    }
    
    public Screen(String title){
        this();
        this.title=title;
    }

    public void setNext(JPanel next){
        if(switchButton!=null){
                this.remove(switchButton);
        }
        if(next!=null){
            switchButton=new Button("next");
            switchButton.addActionListener(e->switchScreens(next));
        }
     }
    public String getTitle(){
        return title;
    }

    private void switchScreens(JPanel panel){
        Component parent = getParent();   
        parent.removeAll();
        parent.add(screen);
        parent.repaint();
        parent.revalidate();
    }
}

然后在您的 MainGUI 方法中

Screen Screen1;
Screen Screen2;
Screen Screen3;
JLayeredPane layeredPane;
public void MainGUI(){
   Screen1 = new Screen("Screen1");
   Screen2 = new Screen("Screen2");
   Screen3 = new Screen("Screen3");
   Screen1.setNext(Screen2);
   Screen2.setNext(Screen3);
   addAll(Screen1,Screen2,Screen3);
}
public void addAll(Screen...screens){
    for(Screen screen : screens){
        layeredPane.add(screen,screen.getTitle());
    }
}