一个类中拥有所有的Java Swing GUI是否正常?

3
我刚开始学习swing开发,遇到了一个问题。将整个GUI放入一个类中是正常的吗?我正在构建的应用程序有一个单独的JFrame,显示多个不同的“页面”。例如,如果用户单击按钮,他们会进入具有不同布局的完全不同的页面。我配置了一个Card Layout,我已经构建了一个使用GridBag布局的卡片。

我的问题是:
1. 每个页面是否应该拥有自己的类?
2. 如果需要,如何在运行卡片布局的GUI控制器和各个页面之间进行通信?
3. 还是应该将所有GUI都放入GUI控制器中并让其这样运行。

以下是我目前所拥有的代码,我对此还很陌生,希望能够掌握它,如果你发现我忽略了任何主要问题,请随意指出。

个别页面的代码:

public class HomePage extends JPanel implements ActionListener{
    private GridBagLayout gl;
    private JPanel frm;
    JButton newPersonalContact;
    HomePage(){
         frm=new JPanel();
         gl=new GridBagLayout();
         GridBagConstraints gbc=new GridBagConstraints();
         frm.setLayout(gl);

         newPersonalContact=new JButton("New Personal Contact");
         JButton newBusinessContact=new JButton("New Business Contact");
         JButton showAllContacts=new JButton("Show All Contacts");
         JButton saveAndQuit=new JButton("Save and Quit");

         JPanel top=new JPanel();
         top.setBackground(new Color(218,165,32));
         top.add(new JLabel("Western Governers University Presents:"));


         JPanel middle=new JPanel();
         middle.setBackground(new Color(43,37,85));
         GridLayout ge=new GridLayout(4,4);
         middle.setLayout(ge);

         middle.add(new JLabel(""));
         middle.add(new JLabel(""));
         middle.add(new JLabel(""));
         middle.add(new JLabel(""));
         middle.add(new JLabel(""));
         middle.add(newPersonalContact);


         middle.add(newBusinessContact);
         middle.add(new JLabel(""));
         middle.add(new JLabel(""));
         middle.add(showAllContacts);

         middle.add(saveAndQuit);
         middle.add(new JLabel(""));middle.add(new JLabel(""));
         middle.add(new  JLabel(""));
         middle.add(new JLabel(""));

         JPanel bottom=new JPanel();
         bottom.setBackground(new Color(218,165,32));

         gbc.fill=GridBagConstraints.BOTH;
         gbc.weightx=1.0;

         gbc.weighty=2.0;
         gbc.gridx=0;
         gbc.gridy=0;
         frm.add(top,gbc);

         gbc.weighty=6.0;
         gbc.gridx=0;
         gbc.gridy=1;
         frm.add(middle,gbc);

         gbc.weighty=1.0;
         gbc.gridx=0;
         gbc.gridy=2;
         frm.add(bottom,gbc);

         newPersonalContact.addActionListener(this);
         newBusinessContact.addActionListener(this);
         showAllContacts.addActionListener(this);
         saveAndQuit.addActionListener(this);


}
    public void actionPerformed(ActionEvent ae){
    if (ae.getSource()==newPersonalContact){
        //What goes here?
    }

}
public JPanel getFrame(){
    return frm;
}

}

GUI 控制器的代码:

public class GUIController {
    JFrame frm;
    CardLayout cl;
    Container pane;
GUIController(){
frm=new JFrame();
frm.setSize(800,600);
frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JPanel card2=new JPanel();
card2.setBackground(Color.black);

JPanel cards=new JPanel(new CardLayout());
cards.add(new HomePage().getFrame(), "Home");
cards.add(card2,"New Personal Contact");
pane=frm.getContentPane();
pane.add(cards,BorderLayout.CENTER);





}
public void start(){
    this.frm.setVisible(true);

}
public void showCard(){
    cl.show(pane, "Card2");
}


}

虽然这是一个学校项目,但GUI界面并不是必需的,只是我对学习它感兴趣。谢谢任何帮助。


经过一番调研,我采用了中介者模式,正如大家所建议的那样。现在它终于能够正常工作了,而且并没有像我想象的那么复杂。感谢大家的帮助! - user3283546
2个回答

4
不,我不建议将所有GUI代码放在一个类中,至少如果它变得很大并且做了几件事情。
在这种情况下,使用中介者模式:
- 将子组件放入JPanel的自定义子类中 - 该子类侦听其子项的事件并更新其他子项 - 如有需要,则触发自己的自定义事件
另外请注意:如果您要学习GUI编程并且没有特定要求使用Swing,请考虑使用更新的GUI工具包JavaFX

你知道有没有一个好的地方可以提供一个详细的中介者模式实例吗? - user3283546

3

如果GUI类变得庞大且难以管理,将其分成几个类是可行的。

一种方法是为每个“页面”创建一个类。让HomePage类具有实例变量,该变量保存对“页面”对象的引用。


我想我明白你的意思。你的意思是我应该有一个类,其中包含从其他“页面”类创建的对象,对吗? - user3283546

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接