web-dev-qa-db-ja.com

javafxのセルファクトリ

私はJavaFx2.0とJava 7を使用しています。問題はJavaFXのテーブルビューに関するものです。

以下のサンプルコードは、firstName列を作成し、それにセルファクトリとセル値ファクトリを割り当てます。

Callback<TableColumn, TableCell> cellFactory = 
new Callback<TableColumn, TableCell>() {
    public TableCell call(TableColumn p) {
        return new EditingCell();
} };


TableColumn firstNameCol = new TableColumn("First Name");
    firstNameCol.setCellValueFactory(
        new PropertyValueFactory<Person,String>("firstName")
    );
firstNameCol.setCellFactory(cellFactory);

私の要件は、Personオブジェクトの単一の属性に直接マップされない列があることですが、代わりに、Personオブジェクトの1つ以上の属性を連結することによって作成されたカスタム値です。

プレフィックス+姓+ "、" +名の値を持つフルネームという名前のテーブル列があるシナリオを考えてみます。

1)このシナリオでは、セル値ファクトリをどのように記述しますか?

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

2)セルファクトリをどのように記述しますか?

このシナリオでは、セル値ファクトリとセルファクトリの両方を実装する必要がありますか、それともどちらかで十分ですか? 1つで十分な場合、どれですか?

ありがとう

9
user1332356

率直に言って、

セル値ファクトリ :これは、関連するセルの行アイテムの一部のみの「toString()」のようなものです。
セルファクトリ :セルアイテムからのセルのレンダラーです。セルアイテムがNodeでない場合、デフォルトの動作はsetText(cell.item.toString())であり、それ以外の場合はsetGraphic((Node)cell.item)です。セルが編集をサポートすることになっている場合はこのプロパティを設定しますORデフォルトのLabel以外のグラフィック(コントロール)が必要な場合)。

したがって、シナリオでは、セルファクトリをデフォルト値のままにしておくだけで十分です(2)。そして、これが(1)のサンプルコードです:

firstAndLastNameCol.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Person, String>, ObservableValue<String>>() {

    @Override
    public ObservableValue<String> call(TableColumn.CellDataFeatures<Person, String> p) {
        if (p.getValue() != null) {
            return new SimpleStringProperty(p.getValue().getPrefix() + " " + p.getValue().getFirstName() + "," + p.getValue().getLastName());
        } else {
            return new SimpleStringProperty("<no name>");
        }
    }
});
25
Uluk Biy

データオブジェクトのgetterメソッドを変更することもできます。あなたの場合、これはクラスPersonであり、firstName、lastName、および(おそらく)プレフィックスを保持します。

Personクラスに新しいメソッドを追加します。

public String getTotalName() {
  return this.prefix + " " + this.getLastName() + ", " + this.getFirstName();
}

次に、CellValueFactoryを適用します。

totalNameCol.setCellValueFactory(
  new PropertyValueFactory<Person,String>("totalName")
);

これは、コールバックを使用するよりも快適だと思います。

6
Peter Ilfrich