2017-07-26 74 views
0

我有一個TableView填充自定義對象;該表顯示該對象的屬性。TableView/CellValueFactory - 基於另一個屬性的值更改顯示的屬性

我的問題是如何根據該行的另一個屬性的值將不同的屬性綁定到列上?

例如,假設我有這樣的對象:

public class MyObject() { 
    private SimpleStringProperty name = new SimpleStringProperty(""); 
    private SimpleStringProperty type = new SimpleStringProperty(""); 
} 
TableView

現在,我有兩列:

+---------+--------+ 
| NAME | TYPE | 
+---------+--------+ 
| Robert | Mgr | 
+---------+--------+ 

但是,如果type = "Something",我想Type列實際顯示name屬性的值代替:

+---------+--------+ 
| NAME | TYPE | 
+---------+--------+ 
| Robert | Robert | 
+---------+--------+ 

我不清楚如何根據同一對象實例中另一個屬性的值設置不同的PropertyValueFactory

回答

1

你應該能夠做這樣的事情:

編輯顯示列定義 - 這需要把對象作爲一個整體,而不是一個字符串。

@FXML 
private TableColumn<MyObject,MyObject> changingColumn; 

...

//Where you initialize the table 
changingColumn.setCellValueFactory(cellData -> new ReadOnlyObjectWrapper<>(cellData.getValue())); 
changingColumn.setCellFactory(tc -> new TableCell<MyObject, MyObject>() { 
     @Override 
     public void updateItem(MyObject item, boolean empty) { 
      super.updateItem(item, empty); 
      if (item == null || empty) { 
       setText(""); 
      } else if ("something".equals(item.getType())){ 
       setText(item.getName()); 
      }else { 
       setText(item.getType()); 
      } 
     } 
    }); 
+0

謝謝你的回覆。但是,我很難將其適應於我自己的情況。首先,'new TableCell ()'拋出一個「錯誤返回類型在lambda中」的錯誤,因爲第二個參數需要一個'String',而不是一個對象。 – Zephyr

+0

我已更新以顯示如何定義您的列 - 它應該採取對象,而不是一個字符串。 –

+0

謝謝。這個結果也很好。我實際上剛剛解決了這個問題,僅使用帶有Lamba表達式的'CellValueFactory'。我在下面添加了我的答案以及它似乎只是更簡單一點。 – Zephyr

0

我能夠採用如下方案,以及:

colType.setCellValueFactory(param -> { 
      if (param.getValue() != null) { 
       if (param.getValue().getType().equals("Something")) { 
        return new SimpleStringProperty(param.getValue().getName); 
       } else { 
        return new SimpleStringProperty(param.getValue().getType()); 
       } 
      } else { 
       return new SimpleStringProperty(""); 
      } 
     });