在几个类中分割GUI

时间:2015-11-21 15:31:21

标签: java swing user-interface split

我正在写一个程序而GUi Class(主类)被重载了。

我想知道是否有可能将课程分成几个班级。 例如,我制作了一类圣徒。

主要问题是我是否可以将所有接口代码保存在一个类中(我将添加和初始化JTetxFields,JButton和其他Jobjects),然后在另一个类中使用它们。

例如: 在接口类中将有:

JTextField field = new JTextField(12);
JButton button = new JButton("Click");

在大班上我像这样做:

add(field);
   add(button);
   button.addActionListener(this);

 public void actionPerformed(ActionEvent e) {
    if(e.getSource==button){
         field.setVisible(false);
} 

如果可以创建新的JFrame,那么请告诉我如何创建新的Frame并在主类中使用它。

1 个答案:

答案 0 :(得分:4)

您的主要问题 - 您是否可以创建一个类组件,该组件是GUI组件的存储库并在其他地方使用它们,答案是肯定的,您可以,但我不认为你应该,至少不是简单的组件。您应该将JTextFields,JButton保存在使用它们的GUI类中,但是GUI的任何主要子部分,例如包含组件且具有独特功能的JPanel,都可以放在自己的类中。

更重要的是将程序的不同功能部分分开,特别是你应该尝试将逻辑或模型分离出来#34;来自GUI或"视图"的程序的一部分部分。有关如何执行此操作的详细信息取决于程序的详细信息和整体问题。

例如:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class SeparateClasses {
    private static void createAndShowGui() {
        SeparateClassView mainPanel = new SeparateClassView();
        new SeparateClassControl(mainPanel);

        JFrame frame = new JFrame("GUI");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGui();
            }
        });
    }
}

public class SeparateClassView extends JPanel {
    private JTextField field1 = new JTextField(12);
    private JTextField field2 = new JTextField(12);
    private JTextField resultField = new JTextField("false", 5);
    private JButton button = new JButton("Click");

    public SeparateClassView() {
        resultField.setEditable(false);
        resultField.setFocusable(false);

        add(new JLabel("Field 1:"));
        add(field1);
        add(new JLabel("Field 2:"));
        add(field2);

        add(button);

        add(new JLabel("Two texts equivalent?:"));
        add(resultField);

    }

    public void addButtonListener(ActionListener listener) {
        button.addActionListener(listener);
        field1.addActionListener(listener);
        field2.addActionListener(listener);
    }

    public String getField1Text() {
        return field1.getText();
    }

    public String getField2Text() {
        return field2.getText();
    }

    public void setField1Text(String text) {
        field1.setText(text);
    }

    public void setField2Text(String text) {
        field2.setText(text);
    }

    public void setResult(boolean result) {
        resultField.setText(String.valueOf(result));
    }
}

public class SeparateClassControl implements ActionListener {
    private SeparateClassView view;

    public SeparateClassControl(SeparateClassView view) {
        this.view = view;
        view.addButtonListener(this);
    }



    @Override
    public void actionPerformed(ActionEvent e) {
        String text1 = view.getField1Text();
        String text2 = view.getField2Text();
        boolean result = SeparateClassModel.stringsEquivalent(text1, text2);
        view.setResult(result);
    }
}

public class SeparateClassModel {
    public static boolean stringsEquivalent(String text1, String text2) {
        return text1.equalsIgnoreCase(text2);
    }
}