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

标签 java swing user-interface

我刚开始进行 swing 开发,遇到了问题。把整个GUI放到一个类里正常吗?我正在构建的应用程序有一个显示多个不同“页面”的 JFrame。例如,如果用户单击一个按钮,他们将被带到一个具有不同布局的完全不同的页面。我已经配置了卡片布局,到目前为止我构建的一张卡片使用的是 GridBag 布局。

那么我的问题是
1.是否每个页面都应该有自己的类?
2. 如果他们这样做,我如何在运行卡片布局的 GUI Controller 和各个页面之间进行通信?
3. 或者我应该将所有 GUI 放入 GUI Controller 并让它像这样运行。

下面是我到目前为止的代码,我是新手,真的很想精通它,所以如果您发现我遗漏的任何主要问题,请随时指出。

单个页面的代码:

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 Controller 的代码:

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 工具包 JavaFX .

关于java - 将所有 java swing gui 放在一个类中是否正常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21626543/

相关文章:

java GUI 窗体打开其他窗体 onclick 按钮

html - 滚动行为平滑, anchor 标记没有区别

fonts - 如何在 Java Web 应用程序中嵌入字体?

java - 如何从 HTML 和 javascript 制作 GWT 小部件?

java - 如何按照我想要的方式对这个 ArrayList 进行排序?

java - 在 Java 中跟踪操作系统级别的窗口事件

java - Android 如何使用 Cursor 在我的直接路径中获取图像和视频缩略图?

java - 当我切换选项卡时 JXMultiSplitPane 变得疯狂

java - 从 EDT 多次重新绘制 JPanel

java - 如何摆脱jframe中的空指针异常?