2016-06-29 58 views
2

我有這個問題,當我運行我的應用程序我看不到元素比我添加到我的表之前,我創建一個類(Personas)和使用PropertyValueFactory。感謝和抱歉在語言錯誤,我會說西班牙語。這是代碼:我不能看到TableView的元素 - JavaFX

package ejemplo.tableview; 

import javafx.application.Application; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.TableColumn; 
import javafx.scene.control.TableView; 
import javafx.scene.control.cell.PropertyValueFactory; 
import javafx.scene.layout.StackPane; 
import javafx.stage.Stage; 


public class EjemploTableView extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     ObservableList<Personas> data = FXCollections.observableArrayList(
       new Personas("Diego","Maradona"), 
       new Personas("Lionel","Messi") 

     ); 
     TableView<Personas> tabla = new TableView(); 

     TableColumn<Personas,String> c1 = new TableColumn("Nombre"); 
     c1.setMinWidth(200d); 
     c1.setCellValueFactory(new PropertyValueFactory<Personas,String>("nombre")); 

     TableColumn<Personas,String> c2 = new TableColumn("Apellido"); 
     c2.setMinWidth(200d); 
     c2.setCellValueFactory(new PropertyValueFactory<>("apellido")); 

     tabla.getColumns().addAll(c1,c2); 
     tabla.setItems(data); 
     StackPane root = new StackPane(); 

     root.getChildren().add(tabla); 

     Scene scene = new Scene(root, 300, 250); 

     primaryStage.setTitle("Hello World!"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     launch(args); 
    } 

} 

這是類人物角色:

package ejemplo.tableview; 

public class Personas { 
    private String nombre; 
    private String apellido; 

    public Personas(String nombre,String apellido){ 
     this.nombre = nombre; 
     this.apellido = apellido; 

    } 
} 
+1

後Personas'的'代碼。我想這個問題會成爲那個班的缺失訪問者。它應該有一個帶有String返回類型的公共'nombreProperty()'或'getNombre()'和一個公共的'apellidoProperty()'或'getApellido()'。 – DVarga

+0

好的,我發佈了代碼,對不起,在這個頁面中我是新的。 –

+0

你覺得比我必須創建兩個getter方法比返回名稱(nombre)和姓氏(apellido)? –

回答

2

檢查的PropertyValueFactory文檔:

的便捷實現回調接口,設計用 專在TableColumn單元格值工廠中。 如何使用此類的示例如下:

TableColumn firstNameCol = new TableColumn(「First Name」); firstNameCol.setCellValueFactory(new PropertyValueFactory(「firstName」));

在這個例子中,「名字」的字符串被用作到 參考假定firstNameProperty()方法在 Person類型(這是 類類型的的TableView項目列表的)。此外,此方法 必須返回屬性實例。如果找到符合這些 要求的方法,則TableCell將填充此ObservableValue。此外,TableView會自動將 觀察者添加到返回值中,以便TableView觀察到的任何更改觸發爲 ,從而導致單元立即更新。

如果沒有方法匹配該模式的存在,對於試圖呼叫得到()是()(即 是,的getFirstName()或isFirstName()在上面的例子)落空 支持或。如果存在匹配此模式的方法 ,則從此方法返回的值爲 ,該值包裝在ReadOnlyObjectWrapper中並返回到TableCell。然而,在這種情況下,這意味着TableCell不會是 能夠觀察ObservableValue的變化(如上面的第一種方法 )。

在此基礎上修改Personas類:

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

public class Personas { 
    private StringProperty nombre = new SimpleStringProperty(); 
    private StringProperty apellido = new SimpleStringProperty(); 

    public StringProperty nombreProperty() {return nombre;}; 
    public StringProperty apellidoProperty() {return apellido;}; 

    public Personas(String nombre, String apellido) { 
     this.nombre.set(nombre); 
     this.apellido.set(apellido); 
    } 

    public String getNombre() {return nombre.get();} 
    public String getApellido() {return apellido.get();} 
}