在将学生管理器程序转换为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()
答案 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实现了两个接口-StudentAdderUIDelegate
和StudentAdderBackendDelegte
,因为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);
}