Jframe中的输入法?

时间:2019-04-25 13:32:34

标签: java swing jframe windowbuilder

在将学生管理器程序转换为GUI模式时遇到一些问题 Student班上有学生的一些信息

public class Student {
    private String id,fullname,mark[],Subject,course[];
    private Time bday;
    private int n;

我创建了一个带有文本字段的Jframe,就像Student类的属性和一个“ Enter”按钮一样 我想当我单击按钮时,将一名学生导入Student的列表中 但是我仍然很困惑,不知道是否应该在单击按钮时将input()方法放在Jframe内作为ActionPerformed还是将Jframe放在{{1 }}类

input()

2 个答案:

答案 0 :(得分:0)

您应该input()逻辑放到JFrame类的Student中,也不要将<{>是否要使用input()方法进行操作)。因为(据我猜测)Student是您的模型,应该具有适当的实例化方法(构造函数,生成器等),而JFrame是一种可帮助您与用户进行交互的机制。我认为JFrame可能具有某种基本逻辑,例如从文本字段解析DateTimes或Integers(仅作为示例。在这种情况下,您还应注意解析异常),但通常不应包含任何逻辑。 应该仅用于创建用户友好的UI / UX,以促进用户与程序的交互。
处理用户输入应在单独的类中完成。说“用户输入处理” 是指验证和解析用户输入,以及在后端执行相应的动作。该类是某种控制器(MVC模式)。

假设您的Student类只有2个字段-名称和年龄。这是您可以使用的代码:

class StudentListController implements StudentAdderUIDelegate, StudentAdderBackendDelegte {
    private List<Student> studentList = new ArrayList<>();

    private StudentAdderUI ui;
    private StudentAdderBackend backend;

    public StudentListController() {
        ui = new StudentAdderUI(this);
        backend = new StudentAdderBackend(this);
    }

    @Override
    public void processStudent(String studentName, String studentAge) {
        // validate studentName
        // validate studentAge

        Student s = ...; // create Student object from studentName & studentAge
        studentList.add(s);
    }

    @Override
    public void uiClosed() {
        // when user done adding students
        // then we can send the list to backend for processing
        backend.processStudentList(studentList);
    }
}

class StudentAdderUI extends JFrame {
    private JTextField studentNameField = new JTextField();
    private JTextField studentAgeField = new JTextField();
    private JButton addStudentBtn = new JButton("Add Student");

    private StudentAdderUIDelegate delegate;

    public StudentAdderUI(StudentAdderUIDelegate delegate) {
        this.delegate = delegate;
        addStudentBtn.addActionListener(e -> {
            delegate.processStudent(studentNameField.getText(), studentAgeField.getText());
        });
        this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosed(WindowEvent e) {
                delegate.uiClosed();
                super.windowClosed(e);
            }
        });
        // layout setup and UI show methods are omitted
    }
}

interface StudentAdderUIDelegate {
    void processStudent(String studentName, String studentAge);
    void uiClosed();
}

class StudentAdderBackend {
    private StudentAdderBackendDelegte delegate;

    public StudentAdderBackend(StudentAdderBackendDelegte delegate) {
        this.delegate = delegate;
    }

    void processStudentList(List<Student> students) {
        // do the computation you need
        // save in DB
        // execute methods on delegate if needed
        // ...
    }
}

interface StudentAdderBackendDelegte {
    // add your methods
}

如您所见,Controller实现了两个接口-StudentAdderUIDelegateStudentAdderBackendDelegte,因为UI和后端都应该能够与Controller通信。他们将数据发送到Controller,Controller处理并确定天气是否将数据从UI传递到后端,反之亦然。
使用此类委托接口可灵活地在以后更改UI和后端。因此,例如,您可以创建一个CLI,该CLI也将保存一个delegate对象的实例,它将从命令行处理用户输入并将输入传递给控制器​​。

答案 1 :(得分:0)

不确定您打算使用此input()方法做什么,但是在执行按钮操作的代码中,您可以解析输入并实例化Student对象(假设Student类包含相关的setter方法),例如:

 public void actionPerformed(ActionEvent arg0) {
        Student student = new Student();
        student.setId(textField.getText());
        student.setName(textField_1.getText());
        ...
        ...

        // then here you could possibly add this Student object in a collection that you would have as an instance variable of your JFrame class, eg:
       studentList.add(student);
 }