単一のPerson
クラスでPersonの情報を表現したいアプリケーションをJavaFXで開発しています。個人の名前がStringProperty
ではなくString
として表されているチュートリアルに出くわしました。これらの違いを検索して this と this を見つけましたが、その説明ではコンセプトを理解するのに十分ではありません。ネット上の一部の投稿は、StringProperty
よりもString
を使用することには利点があると述べましたが、それらについて言及することはできませんでした。
今私の質問です:StringProperty
よりもString
を使用するために必要な条件と、それを行う利点は何ですか?
なぜこれ:
StringProperty firstName;
これ以上:
String firstName;
StringfirstNameよりもStringProperty firstNameを使用する場合
このfirstName
変数が他のユーザーによって監視される場合に使用します。リスナーを付けて観察することもできます。この変数は、JavaFXの他の監視可能なオブジェクトとのバインディングで使用できます。一部の状況では、編集可能なtableViewでレンダリングされたPersonリストのように、JavaFXプロパティの使用が必須です。編集されたセルに変更をすぐに反映するには、基になる連結フィールドをプロパティにする必要があります。
JavaFXはMVCパターンを有効にしようとします。バインディングを利用するには、モデルをプロパティ付きで作成する必要があります。あなたの場合、モデルはPersonクラスなので、単純にStringProperty firstNameを追加できます。しかし、JavaFXでは、Pojo Beanでの単純なゲッターとセッターについては、他の命名規則に注意する必要があります。
JavaFXでの Properties の命名規則は次のとおりです。
public class Person {
private StringProperty firstName;
public void setFirstName(String value) { firstNameProperty().set(value); }
public String getFirstName() { return firstNameProperty().get(); }
public StringProperty firstNameProperty() {
if (firstName == null) firstName = new SimpleStringProperty(this, "firstName");
return firstName;
}
private StringProperty lastName;
public void setLastName(String value) { lastNameProperty().set(value); }
public String getLastName() { return lastNameProperty().get(); }
public StringProperty lastNameProperty() {
if (lastName == null) lastName = new SimpleStringProperty(this, "lastName");
return lastName;
}
}
その後、たとえばTableViewのTableColumnをプロパティ「lastName」にバインドできます。
TableView<Person> table = new TableView<Person>();
ObservableList<Person> teamMembers = getTeamMembers();
table.setItems(teamMembers);
TableColumn<Person,String> lastNameCol = new TableColumn<Person,String>("Last Name");
lastNameCol.setCellValueFactory(new PropertyValueFactory("lastName"));
プロパティがないと、これははるかに多くのコードになり、実装された ChangeListener/InvalidationListener サポートの利点がなくなります。
上記の例はJavaFXからのものです TableView
したがって、Model for JavaFXを作成する際の推奨される方法は、組み込み型ではなくJavaFX-Propertiesを使用することです。