开发者社区 问答 正文

JavaFX-让TableView在应用程序启动时显示数据库表中的数据 问问题

我正在学习JavaFX,并尝试以某种方式修改代码,以使TableView在启动应用程序时显示数据库中已经存在的数据。当前,它仅显示当前会话中加载的数据,但是正在保存到数据库,并且数据已成功保存到数据库。会话重新启动后不会显示。

您能帮我实施该方法吗?如果您需要其他课程,请写评论。

学生负责人:

public class StudentsEditController {
@FXML
private TextField StudentsNameTextField;

@FXML
private TextField StudentsAddressTextField;

@FXML
private Button addStudentButton;

@FXML
private TableView<Students> StudentsTableView;

@FXML
private TableColumn<Students, String> StudentsNameTableColumn;

@FXML
private TableColumn<Students, String> StudentsAddressTableColumn;



Stage thisStage;
StudentsDao dao = DaoFactory.INSTANCE.getStudentsDao();

public void setStage (Stage stage){
    thisStage = stage;
}

public void showStage(){
    thisStage.show();
}

@FXML
void initialize() {
    ObservableList<Students> StudentModel = FXCollections.observableArrayList();
    StudentsTableView.setItems(StudentModel);

    TableColumn<Students, String> nameCol = StudentsNameTableColumn;
    TableColumn<Students, String> addressCol = StudentsAddressTableColumn;

    nameCol.setCellValueFactory(new PropertyValueFactory<Students, String>("Name"));
    addressCol.setCellValueFactory(new PropertyValueFactory<Students, String>("Address"));


    StudentsNameTextField.textProperty().addListener(new ChangeListener<String>() {

        @Override
        public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
            if (newValue != null && newValue.trim().length() > 0) {
                addStudentButton.setDisable(false);
            } else {
                addStudentButton.setDisable(true);
            }
        }
    });


    addStudentButton.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {
            if (StudentsNameTextField.getText().length()>=1) {
                Students studentName = new Students(StudentsNameTextField.getText(), StudentsAddressTextField.getText());
                StudentModel.add(studentName);
                dao.save(studentName);
                StudentsNameTextField.setText("");
                StudentsAddressTextField.setText("");


            }
        }
    });
}
}

展开
收起
垚tutu 2019-12-04 17:01:46 1159 分享 版权
阿里云 AI 助理回答

为了在JavaFX的TableView中显示数据库中已经存在的数据,您需要在初始化方法里加载这些数据。您的initialize()方法目前只设置了TableView的列和数据模型,但没有实际从数据库加载数据。下面是如何修改您的代码以实现这一功能:

首先,确保您的StudentsDao类有一个方法(例如getAllStudents())来获取所有学生的信息。

public List<Student> getAllStudents() {
    // 实现从数据库获取所有学生记录的逻辑
}

然后,在您的initialize()方法中调用这个方法,并将结果添加到StudentModel ObservableList中:

@FXML
void initialize() {
    ObservableList<Student> StudentModel = FXCollections.observableArrayList();
    StudentsTableView.setItems(StudentModel);

    TableColumn<Student, String> nameCol = StudentsNameTableColumn;
    TableColumn<Student, String> addressCol = StudentsAddressTableColumn;

    nameCol.setCellValueFactory(new PropertyValueFactory<>("Name"));
    addressCol.setCellValueFactory(new PropertyValueFactory<>("Address"));

    // 加载数据库中的数据
    loadStudentsFromDatabase(StudentModel);
}

private void loadStudentsFromDatabase(ObservableList<Student> studentModel) {
    try {
        List<Student> students = dao.getAllStudents();
        studentModel.addAll(students);
    } catch (Exception e) {
        // 处理可能的异常,比如数据库连接失败等
        e.printStackTrace();
        // 可能还需要向用户显示错误信息
    }
}

注意: 1. 我将PropertyValueFactory的构造参数改成了使用字符串字面量(双引号包围),这是Java 8之后推荐的做法。 2. 确保您的Student类有与数据库字段相对应的getter方法(如getName()getAddress()),因为PropertyValueFactory会根据这些getter方法名称来绑定列值。 3. 异常处理部分是示例性的,实际应用中您应该提供更详细的错误处理逻辑,包括向用户友好地展示错误信息。

这样,当应用程序启动时,TableView就会自动显示数据库中已有的学生数据了。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: