2017-04-20 25 views
0

正如標題所述,我試圖啓用/禁用基於該錶行數據中的布爾值的錶行內的按鈕。這裏是我的代碼到目前爲止:如何啓用/禁用基於表格內的布爾屬性的按鈕

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; 
     } 
    }); 

不幸的是我的代碼在底線的第五個打破。如果我排除該行並將下面的行更改爲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,tabletableRow屬性稍後更新。因此,檢索cellFactory的方法本身中的任何值都沒有意義,因爲那時這些值都沒有被分配。

+0

這個工程!謝謝。 – Taelsin