2016-05-29 15 views
0

填充表格很容易,當您使用一個類中的數據填充它時,但是當我想使用來自OneToMany關係的數據填充它時,是什麼情況?JavaFX使用OneToMany關係填充桌面視圖

例如:

類人: 標識,名字,姓氏, 汽車(汽車與中高級轎車一個一對多的關係,所以一個人可以有一個或一個以上的汽車)

現在,如果一個人有兩輛車,我怎麼把這個添加到桌子上?

它應該是這個樣子:

ID | firstname | lastname | vehicleBrand(from cars) 
============================================== 
1 | jack  | jackson | crysler 
---------------------------------------------- 
    |    |   | bmw 
---------------------------------------------- 
2 | sally  | jackson | ford 

如果我有一個從人觀察的名單,我可以填充人的數據是這樣的:

firstNameCol.setCellValueFactory(
    new PropertyValueFactory<Person,String>("firstName") 
); 

但類似:

vehicleBrandCol.setCellValueFactory(
new PropertyValueFactory<Cars,String>("vehicleBrand") 
); 

vehicleBrandCol.setCellValueFactory(
new PropertyValueFactory<Person,String>("vehicleBrand") 
); 

不起作用。

編輯: 下面的答案適用於一個品牌。如果我嘗試添加所有我嘗試使用這樣的循環:

for (Car aCars : cars) { 
       return new SimpleObjectProperty<>(aCars.vehicleBrand()); 
      } 

但是循環不循環?! (我打印車的尺寸,它是不是1)

+0

它不會循環,因爲您在第一次點擊'return'語句時正在退出該方法。 –

+0

好吧,這是有道理的^^我應該做一個SimpleObjectProperty的列表並返回這個? – Dusius

+0

不,在這種情況下,它不起作用,因爲您的列應該包含「String」值而不是「List」值。 –

回答

1

這應該是你在找什麼部分,你可以這樣做:

  • 現在我假設你有兩個類PersonCar
  • 該班Person有一個ArrayList<Car>汽車。
  • Person也有一個方法getCars()它返回此人的汽車收集(ArrayList)。

我們從人的TableView顯示在您的Car類獲得品牌可以設置CellValueFactory如下:

vehicleBrandCol.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Person,String>, ObservableValue<String>>() { 
      @Override 
      public ObservableValue<String> call(CellDataFeatures<Person, String> param) { 
       ArrayList<Car> cars = new ArrayList<Car>(); 
       cars = param.getValue().getCars(); 
       if(cars!=null && !cars.isEmpty()) { 
        return new SimpleStringProperty(cars.get(0).getBrand()); 
       } 
      } 
     } 
); 

param.getValue()方法返回作爲參數傳遞的person

請注意,在本例中,我僅返回(顯示)當前人員汽車集合中的第一個汽車品牌,您可以嘗試將此示例應用於您的案例。

好吧,這是有道理的^^我應該做一個列表 SimpleObjectProperty並返回這個?

沒有因爲你是宣稱應該包含String對象不List對象列,你不能做到這一點。

你可以做的是創建自定義的細胞,它會讓你顯示所有的Car品牌各Person實例,你可以看看this example獲得細胞渲染的把握,這是我的例子,可以幫助你在你的情況:

首先細胞在vehicleBrandCol內容的類型設置爲ArrayList<String>

private TableColumn<Person, ArrayList<Car>> vehicleBrandCol;

然後設置CellValueFactory爲弗洛WS:

vehicleBrandCol.setCellValueFactory(new PropertyValueFactory<Person, ArrayList<Car>>("cars"));

,然後你需要定製單元顯示包含此ArrayList內的數據(汽車),所以設置CellFactory如下:

vehicleBrandCol.setCellFactory(column->{ 
      return new TableCell<Person, ArrayList<Car>>() { 
       @Override 
       protected void updateItem(ArrayList<Car> item, boolean empty) { 
        super.updateItem(item, empty); 
        if(item==null || empty) { 
         setGraphic(null); 
        } else { 
         VBox vbox = new VBox(); 
         for(Car car : item) { 
          Label lbl = new Label(car.getBrand()); 
          vbox.getChildren().add(lbl); 
         } 
         setGraphic(vbox); 
        } 
       } 
      }; 
     }); 

請注意,我創建一個VBox和使用標籤,你可以使用任何你喜歡的Node,例如你可以使用ListViewGridPane,並將它們設置爲Cell的圖形。

+0

謝謝,這很有效!但如果我試圖循環訪問列表以獲取所有品牌,則循環不會循環。我編輯了我試過的問題的代碼。 – Dusius