2017-04-19 4 views
0

BeanアダプタオブジェクトをTableViewにバインドする際に問題が発生し、そのアダプタプロパティでコンボボックスが作成されます。 3行のJavaFX TableViewは、各行ごとに別々のBeanアダプタを用意しています。どうやって?

lanSpecie.setCellFactory(new Callback<TableColumn<HAUL,Specie>, TableCell<HAUL,Specie>>() { 
    @Override 
    public TableCell<HAUL, Specie> call(TableColumn<HAUL, Specie> param) { 
     TableCell<HAUL, Specie> cell = new TableCell<>(); 
     ComboBox<Specie> comboBox = new ComboBox<>(FXCollections.observableList(specieService.findAllAdded())); 
      try { 
       comboBox.valueProperty().bindBidirectional(new JavaBeanObjectPropertyBuilder<Object>().bean(haulBean).name("specie").build()); 
      } catch (NoSuchMethodException e) { 
       e.printStackTrace(); 
      } 
      cell.graphicProperty().bind(Bindings.when(cell.emptyProperty()).then((Node) null).otherwise(comboBox)); 
      return cell; 
     } 
    }); 

私のテーブルが追加さ:

Haul table

を私は1つの要素を変更するたびに、それが自動的に右方向への溶液またはガイドをお探しのすべての3

を変更するので、表は各行要素を新しいHAULオブジェクトとして検索し、各行に対して新しいアダプター・インスタンスを作成します。

+0

そのコードの「運搬ビーン」?すべてのコンボボックスの値を1つのプロパティにバインドしているようです。標準['ComboBoxTableCell'](http://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/cell/ComboBoxTableCell.html)はここで使用できませんか? –

+0

haulBeanは私のエンティティオブジェクトです(この場合はPOJOです)。 javabeanアダプタフィールドをComboBoxTableCellにバインドできますか? – Kefirchiks

+0

しかし、どのエンティティオブジェクトですか?各行に1つずつあります。それは本当に意味をなさない。 cell * value *ファクトリを使用してJava Beanアダプタにマップし、セルファクトリを使用してテーブルセルを指定する必要があります。私は 'ComboBoxTableCell'で動作しない理由は見当たりません。 –

答えて

2

セルの新しい値を表示する必要があるときは、セルの個々の値がセルのupdateItem(...)メソッドに渡されます(セルが初期化されるとき、プロパティが変更されたとき、セルが新しい値に再利用されるときなど)。 )。

あなたが標準 ComboBoxTableCellを使用して、細胞に必要な機能を得ることができることを行ってた
lanSpecie.setCellValueFactory(cellData -> 
    new JavaBeanObjectPropertyBuilder<Specie>() 
     .bean(cellData.getValue()) 
     .name("specie") 
     .build()); 

lanSpecie.setCellFactory(ComboBoxTableCell.forTableColumn(
    FXCollections.observableList(specieService.findAllAdded())); 

をあなたはcellValueFactoryを用いて細胞に渡されるを制御することができますComboBoxTableCellは次のようになっています:

lanSpecie.setCellFactory(column -> new TableCell<HAUL, Specie>() { 
    private final ComboBox<Specie> comboBox = new ComboBox<>(); 

    { 
     comboBox.setItems(FXCollections.observableList(specieService.findAllAdded())); 
     comboBox.setOnAction(e -> commitEdit(comboBox.getValue())); 
    } 

    @Override 
    protected void updateItem(Specie specie, boolean empty) { 
     super.updateItem(specie, empty); 
     if (empty) { 
      setGraphic(null); 
     } else { 
      comboBox.setValue(specie); 
      setGraphic(comboBox); 
     } 
    } 
}); 

lanSpecie.setOnEditCommit(event -> { 
    HAUL haul = event.getRowValue(); 
    haul.setSpecie(event.getNewValue()); 
}); 
+0

多くの感謝! 'ComboBoxTableCell'の代わりに' ComboBox'を使用し、そのvalueプロパティをJavabeanObjectPropertyにバインドする方法はありますか? – Kefirchiks

+0

@Kefirchiksまあ、コンボボックスの表のセルはあなたのためにそれを正確に行いますが、もしあなたが本当にしたいと思えばあなたはそれを自分で実装することができます。セル値のファクトリは呼び出されるたびに必ず新しいプロパティインスタンスを作成するため、バインディングを使うことはできないと思うので、代わりにリスナーが必要です。 –

+0

@Kefirchiks自分でセルを実装する例については、更新を参照してください。このセルの実装は少し基本的なものであり、標準セルのやり方で編集状態に出入りすることはありませんが、動作するはずです(テストされません)。 –

関連する問題