我有一些问题将我的学生管理器程序转换为GUI模式Student
课程保存了学生的一些信息
public class Student {
private String id,fullname,mark[],Subject,course[];
private Time bday;
private int n;
我创建了一个带有文本字段的Jframe,就像Student
类的属性和我想要的“输入”按钮,当我点击按钮时,一个学生被导入到Student
s的列表但是我仍然处于困惑中知道我是否应该在单击按钮时将input()
方法放在Jframe中作为ActionPerformed,或者将Jframe放在input()
类的Student
方法中
JButton btnNewButton = new JButton("ENTER");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
String id = textField.getText();
String name = textField_1.getText();
String day1 = textField_2.getText();
String month1 = textField_7.getText();
String year1 = textField_8.getText();
int day = Integer.valueOf(day1);
int month = Integer.valueOf(month1);
int year = Integer.valueOf(year1);
Time bday = new Time(day,month,year);
String email = textField_3.getText();
String acc = textField_4.getText();
String pass = textField_5.getText();
String course1 = textField_6.getText();
int coursen = Integer.valueOf(course1);
}
});
不确定你打算用这个input()方法做什么,但是在你的按钮actionperformed代码中,你可以解析输入并实例化你的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);
}
你不应该把input()
逻辑放在JFrame
里面,也不要放在Student
类里面(虽然我不清楚你想用input()
方法做什么)。因为(我猜)Student
是你的模型应该有适当的实例化方法(Constructors,Builders,e.t.c)和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和Backend都应该能够与Controller通信。他们将数据发送到Controller,后者处理并决定天气将数据从UI传递到后端,反之亦然。
使用此类委托接口可以灵活地在以后更改UI和后端。因此,例如,您可以创建一个CLI,它还将保存delegate
对象的实例,它将从命令行处理用户输入并将输入传递给Controller。