我不太擅长javafx和英语^^。我编写了一个TableView,但我不知道为什么它没有用我创建的项填充表。也许它填满了桌子,但我没有看到它们。我希望有人可以帮助我。这是代码:
private final TableView<VerzeichnisDaten> table = new TableView();
private final ObservableList<VerzeichnisDaten> data = FXCollections.observableArrayList();
TableColumn titleCol = new TableColumn("Titel");
TableColumn lastNameCol = new TableColumn("Nachname");
TableColumn firstNameCol = new TableColumn("Vorname");
TableColumn TelCol = new TableColumn("Telefon");
TableColumn FaxCol = new TableColumn("Fax");
TableColumn EmailCol = new TableColumn("E-Mail");
// here is a loop which wait for a mouse click on an item
// item will be saved in abteilung
try {
VD.mitarbeiter(abteilung);
} catch (SQLException ex) {
/* exception */);
}
centerPane.getChildren().clear();
table.getColumns().clear();
data.clear();
for(int j = 0;j < VD.count_mi;j++) {
data.add(new VerzeichnisDaten(VD.title_speicher[j], VD.lname_speicher[j], VD.fname_speicher[j], VD.tel_speicher[j], VD.fax_speicher[j],VD.email_speicher[j] ));
}
titleCol.setMinWidth(100);
titleCol.setCellValueFactory (new PropertyValueFactory<VerzeichnisDaten, String>("Titel"));
lastNameCol.setMinWidth(100);
lastNameCol.setCellValueFactory (new PropertyValueFactory<VerzeichnisDaten, String>("Nachname"));
firstNameCol.setMinWidth(100);
firstNameCol.setCellValueFactory (new PropertyValueFactory<VerzeichnisDaten, String>("Vorname"));
TelCol.setMinWidth(100);
TelCol.setCellValueFactory (new PropertyValueFactory<VerzeichnisDaten, String>("Telefon"));
FaxCol.setMinWidth(100);
FaxCol.setCellValueFactory (new PropertyValueFactory<VerzeichnisDaten, String>("Fax"));
EmailCol.setMinWidth(100);
EmailCol.setCellValueFactory (new PropertyValueFactory<VerzeichnisDaten, String>("E-Mail"));
table.setItems(data);
table.getColumns().addAll(titleCol,lastNameCol,firstNameCol,TelCol,FaxCol,EmailCol);
centerPane.getChildren().addAll(table);
mainPane.setCenter(centerPane);
}
primaryStage.setScene(new Scene(mainPane, 855, 400));
primaryStage.show();
以下是VerzeichnisDaten类:
String[] title_speicher, lname_speicher, fname_speicher, tel_speicher, fax_speicher, email_speicher;
SimpleStringProperty title, lastName, firstName, Tel, Fax, Email;
public VerzeichnisDaten (String title, String lname, String fname, String tel, String fax, String email) {
this.title = new SimpleStringProperty(title);
this.lastName = new SimpleStringProperty(lname);
this.firstName = new SimpleStringProperty(fname);
this.Tel = new SimpleStringProperty(tel);
this.Fax = new SimpleStringProperty(fax);
this.Email = new SimpleStringProperty(email);
}
// Setter and Getter are now implemented, only not shown
此代码属于VerzeichnisDaten。在他们之上是更多的代码,但是 现在不相关。
void mitarbeiter (String Abteilung) throws SQLException {
// more code ...
stmt = conn.createStatement();
rset = stmt.executeQuery(sql_mi_stmt);
i = 0;
while (rset.next()){
title_speicher[i] = rset.getString("title");
lname_speicher[i] = rset.getString("lname");
fname_speicher[i] = rset.getString("fname");
tel_speicher[i] = rset.getString("tel");
fax_speicher[i] = rset.getString("fax");
email_speicher[i] = rset.getString("email");
i = i + 1;
}
stmt.close();
}
答案 0 :(得分:1)
您提供给PropertyValueFactory
的字符串,例如在这里:
new PropertyValueFactory<VerzeichnisDaten, String>("Titel")
必须与数据类中属性的变量名匹配。
也就是说,如果你有:
class Person {
StringProperty firstNameProperty; // note: must end in "Property", per convention
StringProperty lastNameProperty;
}
相应的属性值工厂将是:
new PropertyValueFactory<Person, String>("firstName") // property name sans "Property" postfix
new PropertyValueFactory<Person, String>("lastName")
在您的代码中,您1)拥有不以“Property”结尾的属性名称,即您拥有:
SimpleStringProperty title, lastName, firstName, Tel, Fax, Email;
和2)您已使用列标题的名称而不是属性值工厂中的属性名称。
因此,您已经发现了基于字符串或类型不安全的一般编程的乐趣:编译器很高兴,但没有任何作用。
JavaFX提供的PropertyValueFactory
充其量只是一种黑客攻击,而且通常是一种不好的做法。如果你看看它的Javadoc,你会看到它的作用:它提供了一种更简单的创建值工厂的方法,而不是通过使用反射和特殊的命名约定来处理丑陋的Callback
SAM(后者为你是受害者)找到合适的财产价值。
使用Java 8的lambda语法,您可以用更简单的方式编写这些值工厂,并且我会忽略PropertyValueFactory
的使用。