Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将所有java swing gui放在一个类中是否正常?_Java_Swing_User Interface - Fatal编程技术网

将所有java swing gui放在一个类中是否正常?

将所有java swing gui放在一个类中是否正常?,java,swing,user-interface,Java,Swing,User Interface,我刚开始使用swing开发,遇到了一个问题。将整个GUI放在一个类中是正常的吗?我正在构建的应用程序只有一个JFrame,可以显示多个不同的“页面”。例如,如果用户单击一个按钮,他们将被带到具有不同布局的完全不同的页面。我已经配置了一个卡片布局,到目前为止我构建的一张卡片使用了GridBag布局 那么,我的问题是 1.是否每个页面都应该有自己的类? 2.如果有,我如何在运行卡布局的GUI控制器和各个页面之间进行通信? 3.或者我应该把所有的GUI放到GUI控制器中,让它像那样运行 下面是我迄今为

我刚开始使用swing开发,遇到了一个问题。将整个GUI放在一个类中是正常的吗?我正在构建的应用程序只有一个JFrame,可以显示多个不同的“页面”。例如,如果用户单击一个按钮,他们将被带到具有不同布局的完全不同的页面。我已经配置了一个卡片布局,到目前为止我构建的一张卡片使用了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界面并不是必需的,只是我感兴趣的东西。谢谢你的帮助。

不,我不建议把所有的GUI代码都放在课堂上——至少如果它变得很大并且做了一些事情的话

在这种情况下,请使用中介模式:

  • 将子组件放入JPanel的自定义子类
  • 该子类侦听其子类的事件并更新其他子类
  • 如果需要,激发自己的自定义事件

也注意:如果你要学习GUI编程,并没有使用Swing的特定要求,考虑使用较新的GUI工具包。

如果GUI类变得大而笨拙,则将其划分为多个类是实用的。


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

你知道一个好地方吗?我可以得到一个深入的中介模式示例吗?我想我理解你的意思。你是说我应该有一个类,它包含从其他“页面”类创建的对象,对吗?经过一点研究,我按照建议使用了一个中介模式。它终于起作用了,不像我想象的那么复杂。谢谢大家的帮助!