12

私はJavaFx2.0とJava7を使用しています。問題は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つで十分ですか?1つで十分な場合、どれですか?

ありがとう

4

2 に答える 2

31

率直に、

Cell Value Factory : 関連するセルの行アイテムの一部のみの「toString()」のようなものです。
セル ファクトリ: セル アイテムからのセルのレンダラーです。デフォルトの動作は、セル項目が でない場合は setText(cell.item.toString()) 、それ以外のNode場合は setGraphic((Node)cell.item) です。セルが編集をサポートする必要がある場合、または default 以外のグラフィック (コントロール) が必要な場合は、このプロパティを設定します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>");
        }
    }
});
于 2012-05-10T10:26:26.813 に答える
8

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

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

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

次に、CellValueFactory を適用します。

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

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

于 2012-08-08T12:17:03.017 に答える