无法用带有javafx的项填充表

时间:2013-11-18 12:41:18

标签: javafx tableview javafx-2 fxml fill

我不太擅长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();    
}

1 个答案:

答案 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的使用。