【问题标题】:split GUI in few classes将 GUI 拆分为几个类
【发布时间】:2015-11-21 15:31:20
【问题描述】:

我正在编写一个程序,并且 GUI 类(主类)被重载。

我想知道是否可以将班级分成几个班级。 比如我做了一类约束。

主要问题是我是否可以将所有接口代码保留在一个类中(我将在其中添加和初始化 JTetxFields、JButtons 和其他 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并在主类中使用它。

【问题讨论】:

  • 您可以并且应该将大类拆分为较小的类,但是如何操作的细节取决于您当前代码的细节,我们对此知之甚少。最好先尝试沿 M-V-C 或模型-视图-控制器线拆分。

标签: java swing user-interface split


【解决方案1】:

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

更重要的是将程序的不同功能部分分开,特别是您应该尝试将程序的逻辑或“模型”部分与 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);
    }
}

【讨论】:

    猜你喜欢
    • 2020-08-16
    • 2015-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    • 2016-03-17
    • 1970-01-01
    相关资源
    最近更新 更多