2017-04-20 13 views
0

タイトルが示すように、テーブル行のデータ内のブール値に基づいてテーブル行内のボタンを有効/無効にしようとしています。これまでのコードは次のとおりです。tablerow内のbooleanプロパティに基づいてボタンを有効/無効にする方法

col.setCellFactory(new Callback<TableColumn<ExampleRow, String>, TableCell<ExampleRow, String>>() { 
     @Override 
     public TableCell call(final TableColumn<ExampleRow, String> param){ 
      final Button btn = new Button("Save"); 
      final TableCell<ExampleRow, String> cell = new TableCell<ExampleRow, String>(){ 

       @Override 
       public void updateItem(String item, boolean empty){ 
        super.updateItem(item, empty); 
        if(empty){ 
         setGraphic(null); 
         setText(null); 
        } else { 
         btn.setPrefWidth(col.getWidth()); 
         btn.setPadding(Insets.EMPTY); 
         btn.setOnAction(event -> { 

         }); 
         setGraphic(btn); 
         setText(null); 
        } 
       } 
      }; 
      ExampleRow row = (ExampleRow)cell.getTableRow().getItem(); //NPE here 
      btn.setDisable(!row.hasChanged()); 
      return cell; 
     } 
    }); 

残念ながら、私のコードは最終行から5番目に壊れています。私がその行を除外し、下の行をbtn.setDisable(true)に変更すると、それはすばらしく機能します。ボタンが存在するデータに基づいてこのボタンを無効にするにはどうすればよいですか?

+0

この列に使用する 'String'プロパティ(つまり、' item'として 'updateItem'メソッドに渡される値)は何ですか?あなたが使っているようには見えません。もしそうでなければ、列を 'TableColumn 'にして、セルの値を 'ExampleRow'の' changed'プロパティにしてはどうですか?次に、 'updateItem'メソッドでボタンの無効状態を直接変更することができます。 –

+0

これは私が[this](http://stackoverflow.com/questions/29489366/how-to-add-button-in-javafx-table-view)の質問で使用していた使用されていないダミーの文字列でした。 – Taelsin

答えて

2

とにかくアイテムを使用していないので、Booleanにしてchangedプロパティの値を使用してください。これは、あなたはupdateItem方法でボタンを有効/無効にすることができます:

例:ところで

public static class Item { 
    private final BooleanProperty changed = new SimpleBooleanProperty(); 

    public final boolean isChanged() { 
     return this.changed.get(); 
    } 

    public final void setChanged(boolean value) { 
     this.changed.set(value); 
    } 

    public final BooleanProperty changedProperty() { 
     return this.changed; 
    } 

} 

@Override 
public void start(Stage primaryStage) { 
    TableView<Item> table = new TableView(); 
    table.getItems().addAll(new Item(), new Item(), new Item()); 

    TableColumn<Item, Boolean> column = new TableColumn<>(); 
    column.setCellValueFactory(cd -> cd.getValue().changedProperty()); 
    column.setCellFactory(col -> new TableCell<Item, Boolean>() { 

     final Button btn = new Button("Save"); 

     { 
      btn.setOnAction(evt -> { 
       Item item = (Item) getTableRow().getItem(); 
       item.setChanged(false); 
      }); 
     } 

     @Override 
     protected void updateItem(Boolean item, boolean empty) { 
      super.updateItem(item, empty); 

      if (empty || item == null) { 
       setGraphic(null); 
      } else { 
       btn.setDisable(!item); 
       setGraphic(btn); 
      } 
     } 

    }); 

    table.getColumns().add(column); 

    Button btn = new Button("change"); 
    btn.setOnAction((ActionEvent event) -> { 
     Item item = table.getSelectionModel().getSelectedItem(); 
     if (item != null) { 
      item.setChanged(true); 
     } 
    }); 

    VBox root = new VBox(btn, table); 

    Scene scene = new Scene(root); 

    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 

TableViewは、細胞を作成するためにcellFactoryを使用しています。 item,tableおよびプロパティは後で更新されます。したがって、cellFactoryのメソッドcallの値そのものを取得することは、その時点でそれらの値が割り当てられていないため意味を持ちません。

+0

これは機能します!ありがとうございました。 – Taelsin

関連する問題