2016-06-14 6 views
2

ObservableListからのデータでTableViewを生成しようとしています。私は前にこれをやったことがありますが、何らかの理由で今は動作させることができません。私は何か例外や何かを得ることはありませんが、テーブルに何も追加しません。JavaFXはObservableListからTableViewを作成します

this質問は類似していますが、JPAによって引き起こされた別の問題が特定されたため、Modificationのコンストラクタは決して実行されません。代わりに、JPAは値を割り当てるために魔法を使います。

は、ここに私のコードです - 私は質問とは無関係だったコードを切り取ら:

FXML

<TableView fx:id="tblModifications" layoutX="14.0" layoutY="14.0" prefHeight="545.0" prefWidth="512.0"> 
    <columns> 
     <TableColumn prefWidth="75.0" text="%itemNumber" fx:id="colModArt"/> 
     <TableColumn prefWidth="75.0" text="%name" fx:id="colModName"/> 
     <TableColumn prefWidth="75.0" text="%amount" fx:id="colModAmount" /> 
    </columns> 
</TableView> 

Main.java

public class Main extends Application implements Initializable { 
    private TableView<Modification> tblModifications; 
    private TableColumn<ObservableList<Modification>, String> colModArt; 
    private TableColumn<ObservableList<Modification>, String> colModName; 
    private TableColumn<ObservableList<Modification>, Integer> colModAmount; 

    @Override 
    public void initialize(URL arg0, ResourceBundle arg1){ 
     colModArt.setCellValueFactory(new PropertyValueFactory<>("barcodeProperty")); 
     colModName.setCellValueFactory(new PropertyValueFactory<>("nameProperty")); 
     colModAmount.setCellValueFactory(new PropertyValueFactory<>("amountProperty")); 

     admin = Administration.getInstance(); 

     tblModifications.setItems(admin.observableModifications); // This list is populated with correct data, I tested. 
    } 

    @Override 
    public void start(Stage primaryStage) throws Exception{ 
     resources = ResourceBundle.getBundle("strings", new Locale("NL")); 
     Parent root = FXMLLoader.load(getClass().getClassLoader().getResource("main.fxml"), resources); 
     primaryStage.setTitle(resources.getString("title")); 
     primaryStage.setScene(new Scene(root, 1280, 1024)); 
     primaryStage.show(); 
    } 
} 

Modification.java

public class Modification { 
    public SimpleStringProperty barcodeProperty; 
    public SimpleStringProperty nameProperty; 
    public SimpleIntegerProperty amountProperty; 
    private int id; 
    private Seller seller; 
    private Product product; 
    private int amount; 
    private Boolean accepted; 

    public Modification(int id, Seller seller, Product product, int amount) { 
     this.id = id; 
     this.seller = seller; 
     this.product = product; 
     this.amount = amount; 
     this.accepted = false; 

     barcodeProperty.set(String.valueOf(product.getBarcode())); 
     nameProperty.set(product.getName()); 
     amountProperty.set(amount); 
    } 
} 

この問題を解決するためのお手伝いをさせていただきます。

+2

可能性のある重複した[JavaFXのPropertyValueFactoryは、テーブルビューを移入ない](http://stackoverflow.com/questions/17035478/javafx-propertyvaluefactory-not-populating-tableview ) – DVarga

+1

また、private TableColumn 、String> colModArt'は 'private TableColumn colModArt'となります。これは、' TableColumn'の定義ごとに有効です。 – DVarga

+0

@DVargaありがとう!私は実際に 'PropertyValueFactory'の名前を変更して正しい情報を得ました。 JPAが別のコンストラクタでオブジェクトを作成して以来、コンストラクタが呼び出されないことに気付きました。私は単純に代わりに値の取得メソッドを作成し、それをすべて修正しました。 –

答えて

1

この問題はJPAによって部分的に引き起こされたようです。

まず、PropertyValueFactoryのフィールド名が正しくありません。どうやらこれが自動的に追加されたので、私は(反射?)彼らからProperty一部を除去しなければならなかった

SimpleStringPropertyはその価値をやったことがなかったので、第二に、JPAの実装はModificationコンストラクタを実行することはありません。私は、これらの値のために私自身のゲッターを書き込むことによって、これを解決:のgetProductNamegetProductBarcode

+0

'PropertyValueFactory'がどのように動作するかを理解するには、[documentation](http://docs.oracle.com)を読んで、コンストラクタが呼び出されていないと良いでしょう。 com/javase/8/javafx/api/javafx/scene/control/cell/PropertyValueFactory.html) –

関連する問題