Вы должны не поместить input()
логику внутри JFrame
или внутри Student
класса (хотя мне не ясно, что вы хотите сделать в input()
метод).Потому что (как мне кажется) Student
- это ваша модель, которая должна иметь надлежащие методы создания экземпляров (Конструкторы, Строители и т. Д.), А JFrame
- это механизм, который помогает вам взаимодействовать с пользователем.По моему мнению, JFrame
может иметь некоторую базовую логику, например, синтаксический анализ DateTimes или Integer из текстовых полей (как в вашем примере. Также вам следует позаботиться о разборе исключений в этом случае), но в целом это должноне содержат какую-либо логику. следует использовать только для создания удобного пользовательского интерфейса / UX для облегчения взаимодействия пользователя с программой.
Обработка ввода пользователя должна выполняться в отдельном классе.Говоря «Обработка пользовательского ввода» Я имею в виду Проверка и анализ Ввод пользователя, а также выполнение соответствующих действий с бэкэндом .Этот класс является своего рода контроллером (MVC Pattern).
Предположим, что у вашего Student
класса есть только 2 поля - name & age. Вот возможный код, который вы можете использовать:
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
}
Как вы можете видеть, Контроллер реализует два интерфейса - StudentAdderUIDelegate
и StudentAdderBackendDelegte
, потому что и UI, и Backend должны иметь возможность общаться с Controller.Они отправляют данные в контроллер, который обрабатывает и решает, передавать ли данные из пользовательского интерфейса в бэкэнд или нет, и наоборот.
Использование таких интерфейсов делегатов дает гибкость для изменения пользовательского интерфейса и бэкэнда позже.Так, например, вы можете создать CLI, который также будет содержать экземпляр объекта delegate
, и он будет обрабатывать пользовательский ввод из командной строки и передавать его в контроллер.