Jframe里面的输入法?

问题描述 投票:0回答:2

我有一些问题将我的学生管理器程序转换为GUI模式Student课程保存了学生的一些信息

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

我创建了一个带有文本字段的Jframe,就像Student类的属性和我想要的“输入”按钮,当我点击按钮时,一个学生被导入到Students的列表但是我仍然处于困惑中知道我是否应该在单击按钮时将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);

            }
        });
java swing jframe windowbuilder
2个回答
0
投票

不确定你打算用这个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);
 }

0
投票

你不应该把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实现了两个接口 - StudentAdderUIDelegateStudentAdderBackendDelegte,因为UI和Backend都应该能够与Controller通信。他们将数据发送到Controller,后者处理并决定天气将数据从UI传递到后端,反之亦然。 使用此类委托接口可以灵活地在以后更改UI和后端。因此,例如,您可以创建一个CLI,它还将保存delegate对象的实例,它将从命令行处理用户输入并将输入传递给Controller。

© www.soinside.com 2019 - 2024. All rights reserved.