Метод ввода внутри Jframe? - PullRequest
0 голосов
/ 25 апреля 2019

У меня возникли проблемы с переводом моей программы Student Manager в режим графического интерфейса. В классе Student хранится некоторая информация об ученике

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

Я создал Jframe с текстовыми полями так же, как свойства Student класс и кнопка «Ввод». Я хочу, чтобы при нажатии на кнопку студент был импортирован в список Student с. Но я все еще в замешательстве и не знаю, стоит ли мне ставить метод 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);

            }
        });

Ответы [ 2 ]

0 голосов
/ 25 апреля 2019

Не уверен, что вы намерены делать с этим методом input (), однако в коде, выполняемом действием кнопки, вы можете проанализировать ввод и создать экземпляр объекта Student (при условии, что ваш класс Student включает в себя соответствующие методы сеттера), например:

 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);
 }
0 голосов
/ 25 апреля 2019

Вы должны не поместить 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, и он будет обрабатывать пользовательский ввод из командной строки и передавать его в контроллер.

...