gpt4 book ai didi

java - 如何修复 Microsoft Access 中的表(使用 SQL)中的数据未显示在我的 TableView (fxml) 上的问题?

转载 作者:行者123 更新时间:2023-12-02 06:18:38 24 4
gpt4 key购买 nike

我只是想看看是否能够使用 FXML 中的 TableView 将 MS Access 中的数据获取到表中,但是 MS Access 中的表中的任何数据都不会出现在 TableView 中。但是,如果我仅将表的内容显示为消息对话框,则会显示所有正确的信息。请有人告诉我哪里出了问题。

我看了这个 YouTube 视频 1 ,并按照它一步步操作,以及其他来源,但没有解决我的问题。


@FXML
private TableView<modelTable> table;
@FXML
private TableColumn<modelTable, StringProperty> colStudentName;
@FXML
private TableColumn<modelTable, StringProperty> colSurname;
@FXML
private TableColumn<modelTable, IntegerProperty> colGrade;
@FXML
private TableColumn<modelTable, StringProperty> colEmail;

ObservableList<modelTable> list = FXCollections.observableArrayList();

@Override
public void initialize(URL url, ResourceBundle rb) {
try {
Connection connection = DBConnect.getConnection();
ResultSet rs = connection.createStatement().executeQuery("SELECT * FROM data");

while (rs.next()) {
//If I run the JOptionPane on its own, all the data is displayed
//JOptionPane.showMessageDialog(null, (rs.getString("StudentName")+ "\t" + rs.getString("Surname") + "\t" + rs.getInt("Grade") + "\t" + rs.getString("Email")));
list.add(new modelTable(rs.getString("StudentName"), rs.getString("Surname"), rs.getInt("Grade"), rs.getString("Email")));
}
} catch (SQLException ex) {
Logger.getLogger(TableController.class.getName()).log(Level.SEVERE, null, ex);
}

colStudentName.setCellValueFactory(new PropertyValueFactory<>("StudentName"));
colSurname.setCellValueFactory(new PropertyValueFactory<>("Surname"));
colGrade.setCellValueFactory(new PropertyValueFactory<>("Grade"));
colEmail.setCellValueFactory(new PropertyValueFactory<>("Email"));

table.setItems(list);
}

}
public class modelTable {

private StringProperty colName, colSurname, colEmail;
private IntegerProperty colGrade;

public modelTable(String colName, String colSurname, int colGrade, String colEmail) {
this.colName = new SimpleStringProperty(colName);
this.colSurname = new SimpleStringProperty(colSurname);
this.colEmail = new SimpleStringProperty(colEmail);
this.colGrade = new SimpleIntegerProperty(colGrade);
}

public String getColName() {
return colName.get();
}

public void setColName(String colName) {
this.colName.set(colName);
}

public String getColSurname() {
return colSurname.get();
}

public void setColSurname(String colSurname) {
this.colSurname.set(colSurname);
}

public String getColEmail() {
return colEmail.get();
}

public void setColEmail(String colEmail) {
this.colEmail.set(colEmail);
}

public int getColGrade() {
return colGrade.get();
}

public void setColGrade(int colGrade) {
this.colGrade.set(colGrade);
}

}
public class DBConnect {

public static Connection getConnection() throws SQLException{
Connection connection = DriverManager.getConnection("jdbc:ucanaccess://C://Users//Huzaifah//Desktop//School work 2019//testing table.accdb");
return connection;
}

当我运行程序时,我希望数据位于 TableView 中,但它是空的。没有给出错误消息,只有一个空表。

我尝试在一个没有 TableView 的简单程序中使用相同的数据库,它工作得很好。

最佳答案

问题在于您如何为每列设置 CellValueFactory:

colStudentName.setCellValueFactory(new PropertyValueFactory<>("StudentName"));
colSurname.setCellValueFactory(new PropertyValueFactory<>("Surname"));
colGrade.setCellValueFactory(new PropertyValueFactory<>("Grade"));
colEmail.setCellValueFactory(new PropertyValueFactory<>("Email"));

您指定的属性(StudentNameSurname 等)与 modelTable 类中的任何公开属性都不匹配。在 modelTable 中,出于某种原因,所有属性都以“col”开头。

As a side note, Java naming conventions suggest that class names begin with a capital letter...

<小时/>

您应该重构 ModelTable 类以使用 TableView 可见的属性。您应该更改属性名称以更好地反射(reflect)数据。添加“col”前缀会令人困惑且不必要,因为您的模型类不应该关心或知道它将如何显示:

import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;

class Scratch {

private final StringProperty name = new SimpleStringProperty();
private final StringProperty surname = new SimpleStringProperty();
private final StringProperty email = new SimpleStringProperty();
private final IntegerProperty grade = new SimpleIntegerProperty();

public modelTable(String colName, String colSurname, int colGrade, String colEmail) {
this.name.set(colName);
this.surname.set(colSurname);
this.email.set(colEmail);
this.grade.set(colGrade);
}

public String getName() {
return name.get();
}

public StringProperty nameProperty() {
return name;
}

public void setName(String name) {
this.name.set(name);
}

public String getSurname() {
return surname.get();
}

public StringProperty surnameProperty() {
return surname;
}

public void setSurname(String surname) {
this.surname.set(surname);
}

public String getEmail() {
return email.get();
}

public StringProperty emailProperty() {
return email;
}

public void setEmail(String email) {
this.email.set(email);
}

public int getGrade() {
return grade.get();
}

public IntegerProperty gradeProperty() {
return grade;
}

public void setGrade(int grade) {
this.grade.set(grade);
}
}
<小时/>

请注意我们现在如何将属性声明为 Final 并将它们初始化为类字段。我们可以这样做,因为我们可以更改属性的,但不会更改属性本身。

另请注意,我们为每个属性添加一个 getter。这允许我们在设置每个 CellValueFactory 时直接在 Controller 中引用它们。

然后您需要更新 setCellValueFactory() 方法以使用新的属性名称。我不建议使用反射(但是,创建一个新的 PropertyValueFactory()),因为对于公开的属性,这是不必要的。

相反,只需直接传递对属性的引用即可:

colStudentName.setCellValueFactory(features -> features.getValue().nameProperty());
colSurname.setCellValueFactory(features -> features.getValue().surnameProperty());
colEmail.setCellValueFactory(features -> features.getValue().emailProperty());
colGrade.setCellValueFactory(features -> features.getValue().gradeProperty());

关于java - 如何修复 Microsoft Access 中的表(使用 SQL)中的数据未显示在我的 TableView (fxml) 上的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55849711/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com