2013-11-18 1 views
0

Я не так хорошо разбираюсь в javafx, а также на английском языке ^^. Я запрограммировал TableView, но я не знаю, почему он не заполняет таблицу элементами, которые я создал. Возможно, он заполняет таблицу, но я их не вижу. Надеюсь, кто-то может помочь мне здесь. Вот код:Невозможно заполнить таблицу товарами с помощью javafx

 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

Просьба попытаться свести к минимуму ваш пример. –

+0

sry, я новичок здесь, но я отредактирую его в необходимых частях – Arktor

+0

http://stackoverflow.com/questions/18497699/populate-a-tableview-using-database-in-javafx попробуйте это ... вы не создание метода setter getter для java-файла –

ответ

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) имеют имена свойств, которые не заканчиваются «собственности », т. е. у вас есть:

и 2) вы использовали имена заголовков столбцов вместо свойства n ames в ваших фабриках стоимости недвижимости.

И, таким образом, вы обнаружили радости программирования на основе строк или типа-небезопасного программирования: компилятор счастлив, но ничего не работает.

PropertyValueFactory, поставляемый с JavaFX, в лучшем случае взломан, и в целом это плохая практика. Если вы посмотрите на его Javadoc, вы точно увидите, что он делает: он обеспечивает более простой способ создания фабрики значений вместо того, чтобы иметь дело с уродливым SAM Callback, используя рефлексию и специальные соглашения об именах (последним, к которому вы были жертвой), чтобы найти правильное значение свойства.

С синтаксисом лямбда Java 8 вы можете написать эти фабрики значений намного проще, и я бы уклонился от использования PropertyValueFactory.

+0

спасибо! :-) теперь это работает! , который мне очень помог ;-) – Arktor

+0

Вы можете отметить правильный ответ, нажав галочку под точками голосования. –