我正在学习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("");
}
}
});
}
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
为了在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就会自动显示数据库中已有的学生数据了。