问题描述
我还是 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());
}
}