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(...)の何が問題になっているのかを明らかにすることができますか?どんな助けも大歓迎です。
ありがとう!
プロパティAPIのやや奇妙な部分は、IntegerProperty
が_ObservableValue<Number>
_ではなく_ObservableValue<Integer>
_を実装することです。だから、やや直感に反して、あなたが必要です
_TableColumn<Person, Number> ageColumn = new TableColumn<Person, Number>("Age");
_
余談ですが、これが問題を引き起こすかどうかはわかりませんが、getメソッドの戻り値の型とセットのパラメーターの型にint
の代わりにInteger
を使用するのがより一般的ですモデルクラスのメソッド。これらはIntegerProperty.get()
およびIntegerProperty.set(...)
の型と一致するため、暗黙的な自動(非)ボクシングを回避します。
.asObjectメソッドを使用してコードを機能させることができます
TableColumn ParamaterをNumberに変更する必要はありません。
ageColumn.setCellValueFactory(cellData -> cellData.getValue().ageProperty().asObject());
どちらがより良いコードであるidk、
パラメーターをNumberに変更するか、asObjectメソッドを使用します
文字列タイプの場合:
firstNameColumn.setCellValueFactory(cellData -> cellData.getValue().firstNameProperty());
IntegerProperty
またはDoubleProperty
を使用する場合、setCellValueFactory(...)
mustに追加のasObject()
:
ageColumn.setCellValueFactory(cellData -> cellData.getValue().ageProperty().asObject());
これは、JavaFXの設計上の決定が不適切なために必要です。