web-dev-qa-db-ja.com

TableViewのJavaFXプロパティ

TableView内でJavaFXプロパティを操作する方法を教えていますが、一部のプロパティタイプで問題が発生しています。 2つのプロパティを含むオブジェクトPersonがあります

public class Person {

    private final StringProperty firstName;
    private final IntegerProperty age;

    public Person(String firstName, Integer age) {
        this.firstName = new SimpleStringProperty(firstName);
        this.age = new SimpleIntegerProperty(age);
    }


    public Integer getAge() {
        return age.get();
    }

    public void setAge(Integer age) {
        this.age.set(age);
    }

    public IntegerProperty ageProperty() {
        return age;
    }

    public String getFirstName() {
        return firstName.get();
    }

    public void setFirstName(String firstName) {
        this.firstName.set(firstName);
    }

    public StringProperty firstNameProperty() {
        return firstName;
    }

}

目標によって作成されたら、TableViewでこのオブジェクトを使用します。このような2つのテーブル列を作成しました。

TableColumn<Person, String> firstNameColumn = new TableColumn<Person, String>("First Name");
TableColumn<Person, Integer> ageColumn = new TableColumn<Person, Integer>("Age");

次に、Lambda式を使用してセル値ファクトリを設定します。ここで問題が発生します。 StringProperty firstNameは正常に機能します。ただし、IntegerPropertyはエラーメッセージを表示します"型の不一致:IntegerPropertyからObservableValue<Integer>に変換できません"

firstNameColumn.setCellValueFactory(cellData -> cellData.getValue().firstNameProperty());
ageColumn.setCellValueFactory(cellData -> cellData.getValue().ageProperty());

誰でもageColumn.setCellValueFactory(...)の何が問題になっているのかを明らかにすることができますか?どんな助けも大歓迎です。

ありがとう!

28
Matt Perry

プロパティAPIのやや奇妙な部分は、IntegerPropertyが_ObservableValue<Number>_ではなく_ObservableValue<Integer>_を実装することです。だから、やや直感に反して、あなたが必要です

_TableColumn<Person, Number> ageColumn = new TableColumn<Person, Number>("Age");
_

余談ですが、これが問題を引き起こすかどうかはわかりませんが、getメソッドの戻り値の型とセットのパラメーターの型にintの代わりにIntegerを使用するのがより一般的ですモデルクラスのメソッド。これらはIntegerProperty.get()およびIntegerProperty.set(...)の型と一致するため、暗黙的な自動(非)ボクシングを回避します。

63
James_D

.asObjectメソッドを使用してコードを機能させることができます
TableColumn ParamaterをNumberに変更する必要はありません。

ageColumn.setCellValueFactory(cellData -> cellData.getValue().ageProperty().asObject());

どちらがより良いコードであるidk、
パラメーターをNumberに変更するか、asObjectメソッドを使用します

関連リンク

8
buncis

文字列タイプの場合:

firstNameColumn.setCellValueFactory(cellData -> cellData.getValue().firstNameProperty());

IntegerPropertyまたはDoublePropertyを使用する場合、setCellValueFactory(...)mustに追加のasObject()

ageColumn.setCellValueFactory(cellData -> cellData.getValue().ageProperty().asObject());

これは、JavaFXの設計上の決定が不適切なために必要です。

ソースとクレジット

0
swapyonubuntu