2017-12-05 16 views
1

私はペットオブジェクトのリストを表示し、すべての行にonclickリスナーを与えるnetbeans/javafxプログラムを設定しようとしています。私はFXMLで、以下のいるrowfactoryを追加した後にJavafxテーブルビューが表示されない

MyTables.fxml

<VBox alignment="CENTER" layoutX="11.0" layoutY="12.0" prefWidth="345.0"> 
    <children> 
     <TableView id="Table1" fx:id="Table1" styleClass="mytable"/> 
     <TableView id="Table2" fx:id="Table2" styleClass="mytable"/> 
     <TableView id="Table3" fx:id="Table3" styleClass="mytable"/> 
     <TableView id="Table4" fx:id="Table4" styleClass="mytable"/> 
    </children> 
</VBox> 

私は、今度は、私はFXMLをロードビューのためトップコンポーネントを設定し、NetBeansのを使用していますコントローラクラスをロードします。

私のコントローラクラスでは、次のコードを使用してテーブルにコンテンツを追加します。各テーブルは、含まれるペットオブジェクトのID、名前、および所有者に対応する3行を持つことを意図しています。ここに私の問題だ

Pet.java

public final class Pet { 

    public final StringProperty id = new SimpleStringProperty(this, "id"); 
    public final StringProperty name = new SimpleStringProperty(this, "name"); 
    public final StringProperty owner = new SimpleStringProperty(this, "owner"); 

    public Pet() {} 

    public Pet(String id, String name, String owner) { 
     this.id.set(id); 
     this.name.set(name); 
     this.owner.set(owner); 
    } 

    public String getId() { 
     return id.get(); 
    } 

    public void setId(String id) { 
     this.id.set(id); 
    } 

    public StringProperty idProperty() { 
     return id; 
    } 

    public String getName() { 
     return name.get(); 
    } 

    public void setName(String name) { 
     this.name.set(name); 
    } 

    public StringProperty nameProperty() { 
     return name; 
    } 

    public String getOwner() { 
     return owner.get(); 
    } 

    public void setOwner(String owner) { 
     this.owner.set(owner); 
    } 

    public StringProperty ownerProperty() { 
     return owner; 
    } 
} 

MyTablesController.java

public class MyTablesController implements Initializable { 

    @FXML 
    private TableView<Pet> Table1; 
    @FXML 
    private TableView<Pet> Table2; 
    @FXML 
    private TableView<Pet> Table3; 
    @FXML 
    private TableView<Pet> Table4; 

    private TableView<Pet>[] allTables; 

    public MyTablesController() { 
     allTables = new TableView[4]; 
     allTables[0] = Table1; 
     allTables[1] = Table2; 
     allTables[2] = Table3; 
     allTables[3] = Table4; 
    } 

    @Override 
    public void initialize(URL location, ResourceBundle resources) { 
     for(TableView<Pet> table : allTables) { 
      table.getColumns().add(createCol("ID", Pet::idProperty, 100)); 
      table.getColumns().add(createCol("Name", Pet::nameProperty, 140)); 
      table.getColumns().add(createCol("Owner", Pet::ownerProperty, 100)); 
      table.getItems().addAll(
        new Pet("1234", "spot", "joe"), 
        new Pet("5432", "snowball", "bill"), 
        new Pet("7612", "snoopy", "frank") 
      ); 
     } 

     setupTableRowDragEvents(); 
    } 

    private TableColumn<Pet, String> createCol(String title, 
      Function<Pet, ObservableValue<String>> mapper, double size) { 

     TableColumn<Pet, String> col = new TableColumn<>(title); 
     col.setCellValueFactory(cellData -> mapper.apply(cellData.getValue())); 
     col.setPrefWidth(size); 
     return col ; 
    } 

    private void setupTableRowDragEvents() { 
     for (TableView<Pet> table : allTables) { 
      table.setRowFactory(tv -> { 
       TableRow<Pet> row = new TableRow<>(); 
       row.setOnMouseClicked(event -> { 
        System.out.println("I CLICKED ON " + row.getItem().getName()"); 
       }); 
       return row; 
      }); 
     } 
    } 
} 

は最後に、ここではペットオブジェクトです。

MyTablesController.initializeを空のままにしておくと、4つのグラフがうまく表示されます。

initialize()内のもののいずれかまたは両方が存在する場合、グラフは表示されません。このコードは、setCols呼び出しとsetupTableRowDragEvents()呼び出しの残りの部分を追加するときだけです。ウィンドウが完全に空で、グラフが表示されない以外は、エラーメッセージや奇妙な動作が発生しません。

私はsort tableview with drag and drop (rows)からコードを外しています。私はこれと比較したときに私がどこまで悩んでいるのか分かりません。その答えは間違っていて、誰もそれをチェックするのに気にしていませんでしたか?

私はここで間違っていますか?

+1

initializeメソッドはnullポインタ例外をスローする必要があります。配列を作成するときに、テーブルビューの参照はすべてnullであるため、配列にnull参照を埋めます。その後、配列を反復処理すると、 'table.getColumns()'を初めて呼び出すときにnullポインタ例外が発生します。コードをコントローラのコンストラクタから 'initialize()'の先頭に移動します。 –

+0

あなたはちょうど私のベーコンを救った、私は昨日のすべてを無駄にこの事を突くのを費やした、私はちょうど間違った場所を探していた。私の次のタスクは、例外が出力コンソールに表示されない理由を把握していますが、それは別の問題です。 – MattT

+0

これに答えるためにFXMLをロードするコードを投稿する必要があります。恐らく例外を押しつぶすことはないでしょうか?とにかく、私はついにコンピュータに戻り、空港を巡ることなく、答えとしてコメントを投稿しました。 –

答えて

1

配列を作成するときに、テーブルビューの参照はすべてnullであるため、配列にnull参照を入力します。配列を反復処理すると、最初にtable.getColumns()と呼ぶときにnullポインタ例外が発生します。コントローラのコンストラクタのコードをinitialize()の先頭に移動します。

public class MyTablesController implements Initializable { 

    @FXML 
    private TableView<Pet> Table1; 
    @FXML 
    private TableView<Pet> Table2; 
    @FXML 
    private TableView<Pet> Table3; 
    @FXML 
    private TableView<Pet> Table4; 

    private TableView<Pet>[] allTables; 

    @Override 
    public void initialize(URL location, ResourceBundle resources) { 

     allTables = new TableView[4]; 
     allTables[0] = Table1; 
     allTables[1] = Table2; 
     allTables[2] = Table3; 
     allTables[3] = Table4; 

     for(TableView<Pet> table : allTables) { 
      table.getColumns().add(createCol("ID", Pet::idProperty, 100)); 
      table.getColumns().add(createCol("Name", Pet::nameProperty, 140)); 
      table.getColumns().add(createCol("Owner", Pet::ownerProperty, 100)); 
      table.getItems().addAll(
        new Pet("1234", "spot", "joe"), 
        new Pet("5432", "snowball", "bill"), 
        new Pet("7612", "snoopy", "frank") 
      ); 
     } 

     setupTableRowDragEvents(); 
    } 

    // ... 

} 
関連する問題