[解決済み] SimpleStringPropertyとSimpleIntegerProperty TableView JavaFX
質問
私はJavaFxテーブルビューの使い方を学ぼうとしていて、このチュートリアルに行き当たりました。
このチュートリアルでは、tableViewに文字列を入力する必要があることを説明しています。
String
から
SimpleStringProperty
フォーマットなしで試したところ、どの情報も表示されませんでした。
また、このような場合は
Integer
としてテーブルに宣言する必要があります。
SimpleIntegerProperty
私はJavaFxの初心者ですが、これはオブジェクトを作成するときに、TableViewを埋めることができるようにすべての整数と文字列をフォーマットしなければならないということでしょうか? それはかなり愚かだと思いますが、多分高い目的があるのでしょうか? またはそれを避ける方法はありますか?
解決方法は?
テーブル・データ・オブジェクトを表示するためにPropertiesを使用する必要はありませんが、特定の状況下ではPropertiesを使用することが望ましいです。
次のコードは、String フィールドのみを持つ Person クラスに基づいた人物のテーブルを表示するものです。
import javafx.application.Application;
import javafx.collections.*;
import javafx.geometry.Insets;
import javafx.scene.*;
import javafx.scene.control.*;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;
public class ReadOnlyTableView extends Application {
private TableView<Person> table = new TableView<Person>();
private final ObservableList<Person> data =
FXCollections.observableArrayList(
new Person("Jacob", "Smith", "[email protected]"),
new Person("Isabella", "Johnson", "[email protected]"),
new Person("Ethan", "Williams", "[email protected]"),
new Person("Emma", "Jones", "[email protected]"),
new Person("Michael", "Brown", "[email protected]")
);
public static void main(String[] args) { launch(args); }
@Override public void start(Stage stage) {
stage.setTitle("Table View Sample");
stage.setWidth(450);
stage.setHeight(500);
final Label label = new Label("Address Book");
label.setFont(new Font("Arial", 20));
TableColumn firstNameCol = new TableColumn("First Name");
firstNameCol.setMinWidth(100);
firstNameCol.setCellValueFactory(new PropertyValueFactory<Person, String>("firstName"));
TableColumn lastNameCol = new TableColumn("Last Name");
lastNameCol.setMinWidth(100);
lastNameCol.setCellValueFactory(new PropertyValueFactory<Person, String>("lastName"));
TableColumn emailCol = new TableColumn("Email");
emailCol.setMinWidth(200);
emailCol.setCellValueFactory(new PropertyValueFactory<Person, String>("email"));
table.setItems(data);
table.getColumns().addAll(firstNameCol, lastNameCol, emailCol);
final VBox vbox = new VBox();
vbox.setSpacing(5);
vbox.setPadding(new Insets(10, 0, 0, 10));
vbox.getChildren().addAll(label, table);
stage.setScene(new Scene(new Group(vbox)));
stage.show();
}
public static class Person {
private String firstName;
private String lastName;
private String email;
private Person(String fName, String lName, String email) {
this.firstName = fName;
this.lastName = lName;
this.email = email;
}
public String getFirstName() { return firstName; }
public void setFirstName(String fName) { firstName = fName; }
public String getLastName() { return lastName; }
public void setLastName(String lName) { lastName = lName; }
public String getEmail() { return email; }
public void setEmail(String inMail) { email = inMail; }
}
}
説明
PropertiesとObservableListを使用する目的は、これらがリッスン可能な要素であるためである。プロパティを使用すると、データモデル内のプロパティ属性の値が変更された場合、TableView内のアイテムのビューは、更新されたデータモデルの値に合わせて自動的に更新されます。 例えば、ある人の email プロパティの値が新しい値に設定されると、プロパティの変更をリッスンするため、その更新は TableView に反映されます。 代わりに、電子メールを表すためにプレーン文字列が使用されていた場合、TableView は電子メール値の変更を認識しないため、更新されません。
その プロパティバリューファクトリー のドキュメントに、この処理の詳細が記述されています。
このクラスの使用例です。
TableColumn<Person,String> firstNameCol = new TableColumn<Person,String>("First Name"); firstNameCol.setCellValueFactory(new PropertyValueFactory<Person,String>("firstName"));
この例では、"firstName" という文字列が、quot;firstName" という文字列への参照として使用されています。 Person クラスの firstNameProperty() メソッドを想定しています。 は、TableView の項目リストのクラスタイプです)。さらに、このメソッド はPropertyインスタンスを返さなければならない。これらの条件を満たすメソッドがある場合 が見つかれば、TableCellにこの ObservableValue。さらに、TableViewは自動的に オブザーバは、返された値に対して行われるすべての変更を監視します。 その結果、セルは直ちに更新されます。
このパターンに合致するメソッドが存在しない場合は、フォールスルーで get()またはis()を呼び出そうとした場合のサポート(すなわち は、上記の例では getFirstName() または isFirstName() です)。もしメソッド このパターンにマッチするメソッドが存在する場合、このメソッドから返される値は をReadOnlyObjectWrapperでラップして、TableCellに返します。 しかし、この状況では、これはTableCellが のように)ObservableValueの変化を観察することができる。 を使用します。)
アップデート
最初の例とは対照的な例で、TableView が ObservableList のアイテムの変更と、プロパティベースのアイテム属性の値の変更に基づいて、自動的にリフレッシュする方法を示しています。
import javafx.application.Application;
import javafx.beans.property.*;
import javafx.collections.*;
import javafx.event.*;
import javafx.geometry.Insets;
import javafx.scene.*;
import javafx.scene.control.*;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;
public class PropertyBasedTableView extends Application {
private TableView<Person> table = new TableView<Person>();
private final ObservableList<Person> data = FXCollections.observableArrayList();
private void initData() {
data.setAll(
new Person("Jacob", "Smith", "[email protected]"),
new Person("Isabella", "Johnson", "[email protected]"),
new Person("Ethan", "Williams", "[email protected]"),
new Person("Emma", "Jones", "[email protected]"),
new Person("Michael", "Brown", "[email protected]")
);
}
public static void main(String[] args) { launch(args); }
@Override public void start(Stage stage) {
initData();
stage.setTitle("Table View Sample");
stage.setWidth(450);
stage.setHeight(500);
final Label label = new Label("Address Book");
label.setFont(new Font("Arial", 20));
TableColumn firstNameCol = new TableColumn("First Name");
firstNameCol.setMinWidth(100);
firstNameCol.setCellValueFactory(new PropertyValueFactory<Person, String>("firstName"));
TableColumn lastNameCol = new TableColumn("Last Name");
lastNameCol.setMinWidth(100);
lastNameCol.setCellValueFactory(new PropertyValueFactory<Person, String>("lastName"));
TableColumn emailCol = new TableColumn("Email");
emailCol.setMinWidth(200);
emailCol.setCellValueFactory(new PropertyValueFactory<Person, String>("email"));
table.setItems(data);
table.getColumns().addAll(firstNameCol, lastNameCol, emailCol);
table.setPrefHeight(300);
final Button setEmailButton = new Button("Set first email in table to [email protected]");
setEmailButton.setOnAction(new EventHandler<ActionEvent>() {
@Override public void handle(ActionEvent event) {
if (data.size() > 0) {
data.get(0).setEmail("[email protected]");
}
}
});
final Button removeRowButton = new Button("Remove first row from the table");
removeRowButton.setOnAction(new EventHandler<ActionEvent>() {
@Override public void handle(ActionEvent event) {
if (data.size() > 0) {
data.remove(0);
}
}
});
final Button resetButton = new Button("Reset table data");
resetButton.setOnAction(new EventHandler<ActionEvent>() {
@Override public void handle(ActionEvent event) {
initData();
}
});
final VBox vbox = new VBox(10);
vbox.setPadding(new Insets(10, 0, 0, 10));
vbox.getChildren().addAll(label, table, setEmailButton, removeRowButton, resetButton);
stage.setScene(new Scene(new Group(vbox)));
stage.show();
}
public static class Person {
private final StringProperty firstName;
private final StringProperty lastName;
private final StringProperty email;
private Person(String fName, String lName, String email) {
this.firstName = new SimpleStringProperty(fName);
this.lastName = new SimpleStringProperty(lName);
this.email = new SimpleStringProperty(email);
}
public String getFirstName() { return firstName.get(); }
public void setFirstName(String fName) { firstName.set(fName); }
public StringProperty firstNameProperty() { return firstName; }
public String getLastName() { return lastName.get(); }
public void setLastName(String lName) { lastName.set(lName); }
public StringProperty lastNameProperty() { return lastName; }
public String getEmail() { return email.get(); }
public void setEmail(String inMail) { email.set(inMail); }
public StringProperty emailProperty() { return email; } // if this method is commented out then the tableview will not refresh when the email is set.
}
}
関連
-
[解決済み】エラー:'if'のない'else'エラー
-
[解決済み】 java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver [重複]。
-
[解決済み] java.sql.SQLException を取得しました。ResultSet が終了した後の操作は許可されません。
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] リフレクションとは何か、なぜ有用なのか?
-
[解決済み] Javaで配列を宣言し、初期化する方法は?
-
[解決済み] Java内部クラスと静的ネストされたクラス
-
[解決済み] 浮動小数点以下の0を削除して文字列に変換する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラー:'if'のない'else'エラー
-
[解決済み] hibernateでResultSetを抽出できない。
-
[解決済み】Javaクラスの "型に解決できない"
-
[解決済み】なぜjava.io.Fileにはcloseメソッドがないのでしょうか?
-
[解決済み】Eclipseで「JUnitテストが見つかりませんでした。
-
[解決済み] StringBuilderをクリアまたは空にするにはどうすればよいですか?重複] [重複] [重複] [重複] [重複] [重複
-
[解決済み] java.sql.SQLException を取得しました。ResultSet が終了した後の操作は許可されません。
-
[解決済み】どういう意味か。Serializableクラスがstatic final serialVersionUIDフィールドを宣言していないとは?重複している] [重複している] [重複している] [重複している
-
[解決済み] "java.nio.charset.MalformedInputException" を避けるために、すべての包括的なCharset。入力の長さ= 1"?
-
[解決済み] Java内部クラスと静的ネストされたクラス