JavaFXで選択ボックスの作成・イベントを登録する方法について記載します。
選択ボックスを作成する方法は色々ありますが
2. キー・バリューを指定して選択ボックスを作成する方法
について記載します。
目次
1. 文字列を指定して選択ボックスの作成・イベントを登録する方法
1-1. 選択ボックスの作成
選択ボックスを作成するには、ChoiceBoxクラスを使用します。
構文
cb.getItems().addAll(“要素1″,”要素2″,”要素3”);
実行例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
import javafx.application.Application; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.ChoiceBox; import javafx.scene.layout.VBox; import javafx.stage.Stage; public class Main extends Application { public static void main(String[] args){ Application.launch(args); } @Override public void start(Stage pStage) throws Exception { // ChoiceBox ChoiceBox<String> cb = new ChoiceBox<>(); cb.getItems().addAll("apple","orange","banana"); // 配置 VBox vbRoot = new VBox(); vbRoot.setAlignment(Pos.CENTER); vbRoot.setSpacing(10); vbRoot.getChildren().addAll(cb); pStage.setTitle("選択ボックス"); pStage.setWidth(300); pStage.setHeight(200); pStage.setScene(new Scene(vbRoot)); pStage.show(); } } |
1-2. イベントの登録
選択ボックスにイベントを登録するには、addListener メソッドを使用します。
構文
cb.getSelectionModel().selectedIndexProperty().addListener( ChangeListener<Number> );
addListener メソッドの引数には、ChangeListenerインタフェースを実装したクラスを指定します。
実行例
リストを変更すると、次のメッセージが表示されます。
ChangeListenerインタフェースを実装したクラスを使用してイベントを登録
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
import javafx.application.Application; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.Alert; import javafx.scene.control.Alert.AlertType; import javafx.scene.control.ChoiceBox; import javafx.scene.layout.VBox; import javafx.stage.Stage; public class Main extends Application { public static void main(String[] args){ Application.launch(args); } @Override public void start(Stage pStage) throws Exception { // ChoiceBox ChoiceBox<String> cb = new ChoiceBox<>(); cb.getItems().addAll("apple","orange","banana"); // 選択ボックスのアクション cb.getSelectionModel().selectedIndexProperty().addListener( new ActionChoiceBox() ); // 配置 VBox vbRoot = new VBox(); vbRoot.setAlignment(Pos.CENTER); vbRoot.setSpacing(10); vbRoot.getChildren().addAll(cb); pStage.setTitle("選択ボックス"); pStage.setWidth(300); pStage.setHeight(200); pStage.setScene(new Scene(vbRoot)); pStage.show(); } // 選択ボックスのアクション class ActionChoiceBox implements ChangeListener<Number>{ @Override public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) { // 選択された要素のインデックスを表示 Alert alert = new Alert(AlertType.INFORMATION); alert.setTitle("イベント"); alert.setContentText( "選択された要素のインデックス:" + newValue.toString() ); alert.show(); } } } |
上記の例では、ChangeListenerインタフェースを実装したクラスを使用してイベントを登録しましたが、次のようにラムダ式を使用してイベントを登録することもできます。
ラムダ式を使用してイベントを登録
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
import javafx.application.Application; import javafx.beans.value.ObservableValue; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.Alert; import javafx.scene.control.Alert.AlertType; import javafx.scene.control.ChoiceBox; import javafx.scene.layout.VBox; import javafx.stage.Stage; public class Main extends Application { public static void main(String[] args){ Application.launch(args); } @Override public void start(Stage pStage) throws Exception { // ChoiceBox ChoiceBox<String> cb = new ChoiceBox<>(); cb.getItems().addAll("apple","orange","banana"); cb.getSelectionModel().selectedIndexProperty().addListener( (ObservableValue<? extends Number> ov, Number oldValue, Number newValue) -> { // 選択された要素のインデックスを表示 Alert alert = new Alert(AlertType.INFORMATION); alert.setTitle("イベント"); alert.setContentText( "選択された要素のインデックス:" + newValue.toString() ); alert.show(); } ); // 配置 VBox vbRoot = new VBox(); vbRoot.setAlignment(Pos.CENTER); vbRoot.setSpacing(10); vbRoot.getChildren().addAll(cb); pStage.setTitle("選択ボックス"); pStage.setWidth(300); pStage.setHeight(200); pStage.setScene(new Scene(vbRoot)); pStage.show(); } } |
1-3. 任意の値を選択する方法
SingleSelectionModelクラスのselectメソッドを使用すると、インデックスを指定して任意の値を選択状態にすることができます。
構文
cb.getItems().addAll(“apple”,”orange”,”banana”);
cb.getSelectionModel().select(1);
実行例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
import javafx.application.Application; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.ChoiceBox; import javafx.scene.layout.VBox; import javafx.stage.Stage; public class Main extends Application { public static void main(String[] args){ Application.launch(args); } @Override public void start(Stage pStage) throws Exception { // ChoiceBox ChoiceBox<String> cb = new ChoiceBox<>(); cb.getItems().addAll("apple","orange","banana"); // デフォルトの選択肢を設定(インデックスで指定) cb.getSelectionModel().select(1); // 配置 VBox vbRoot = new VBox(); vbRoot.setAlignment(Pos.CENTER); vbRoot.setSpacing(10); vbRoot.getChildren().addAll(cb); pStage.setTitle("選択ボックス"); pStage.setWidth(300); pStage.setHeight(200); pStage.setScene(new Scene(vbRoot)); pStage.show(); } } |
2. キー・バリューを指定して選択ボックスの作成・イベントを登録する方法
キー・バリューを使用した場合のメリットは、イベント発生時に選択された要素のキー・バリューの値を取得できます。
1の文字列を指定した選択ボックスの場合は、イベント発生時に選択された要素のインデックスを取得できます。
この場合、選択ボックスに表示する要素に変更があった際に都合が悪くなります。
例えば、選択された要素のインデックスをDBに保存していた場合、選択ボックスの途中に要素が追加になると、既存の要素のインデックスが変わってしまうため、DBに保存した既存の値を変更する必要があります。
2-1. 選択ボックスの作成
キー・バリューを指定して選択ボックスを作成するには、独自のクラスを実装して、そのクラスのインスタンスを値として選択ボックスを作成します。
構文
cb.getItems().addAll(インスタンスA,インスタンスB,インスタンスC);
実行例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
import javafx.application.Application; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.ChoiceBox; import javafx.scene.layout.VBox; import javafx.stage.Stage; /** * 選択ボックスの各要素のクラス */ class Fruits { final String key; final String value; public Fruits( String key, String value ) { this.key = key; this.value = value; } /** * toStringメソッドで返した値が、選択ボックスの表示名として使われます */ @Override public String toString() { return value; } } public class Main extends Application { public static void main(String[] args){ Application.launch(args); } @Override public void start(Stage pStage) throws Exception { // ChoiceBox ChoiceBox<Fruits> cb = new ChoiceBox<>(); cb.getItems().addAll( new Fruits( "001", "apple"), new Fruits( "002", "orange"), new Fruits( "003", "banana")); // 配置 VBox vbRoot = new VBox(); vbRoot.setAlignment(Pos.CENTER); vbRoot.setSpacing(10); vbRoot.getChildren().addAll(cb); pStage.setTitle("選択ボックス"); pStage.setWidth(300); pStage.setHeight(200); pStage.setScene(new Scene(vbRoot)); pStage.show(); } } |
ポイントは選択ボックスに表示する各要素の名前は toString メソッドをオーバーライドして指定します。
上記の例では、Fruitsクラスの変数(value)の値を選択ボックスに表示する名前としています。
2-2. イベントの登録
選択ボックスにイベントを登録するには、addListener メソッドを使用します。
構文
cb.getSelectionModel().selectedItemProperty().addListener( ChangeListener<独自クラス> );
addListener メソッドの引数には、ChangeListenerインタフェースを実装したクラスを指定します。
実行例
リストを変更すると、次のメッセージが表示されます。
ChangeListenerインタフェースを実装したクラスを使用してイベントを登録
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
import javafx.application.Application; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.Alert; import javafx.scene.control.Alert.AlertType; import javafx.scene.control.ChoiceBox; import javafx.scene.layout.VBox; import javafx.stage.Stage; /** * 選択ボックスの各要素のクラス */ class Fruits { final String key; final String value; public Fruits( String key, String value ) { this.key = key; this.value = value; } /** * toStringメソッドで返した値が、選択ボックスの表示名として使われます */ @Override public String toString() { return value; } } public class Main extends Application { public static void main(String[] args){ Application.launch(args); } @Override public void start(Stage pStage) throws Exception { // 選択ボックスに表示するインスタンス Fruits apple = new Fruits( "001", "apple"); Fruits orange = new Fruits( "002", "orange"); Fruits banana = new Fruits( "003", "banana"); // ChoiceBox ChoiceBox<Fruits> cb = new ChoiceBox<>(); cb.getItems().addAll(apple, orange, banana); // 選択ボックスのアクション cb.getSelectionModel().selectedItemProperty().addListener( new ActionChoiceBox() ); // 配置 VBox vbRoot = new VBox(); vbRoot.setAlignment(Pos.CENTER); vbRoot.setSpacing(10); vbRoot.getChildren().addAll(cb); pStage.setTitle("選択ボックス"); pStage.setWidth(300); pStage.setHeight(200); pStage.setScene(new Scene(vbRoot)); pStage.show(); } // 選択ボックスのアクション class ActionChoiceBox implements ChangeListener<Fruits>{ @Override public void changed(ObservableValue<? extends Fruits> observable, Fruits oldValue, Fruits newValue) { // 選択された要素のキー・バリューを表示 Alert alert = new Alert(AlertType.INFORMATION); alert.setTitle("イベント"); alert.setContentText( newValue.key + ":" + newValue.value ); alert.show(); } } } |
上記の例では、ChangeListenerインタフェースを実装したクラスを使用してイベントを登録しましたが、ラムダ式を使用してイベントを登録することもできます。
ラムダ式を使用した方法は、1-2 と同様なのでそちらを参照ください。
2-3. 任意の値を選択する方法
SingleSelectionModelクラスのselectメソッドを使用すると、独自クラスのインスタンスを指定して任意の値を選択状態にすることができます。
構文
cb.getItems().addAll(apple, orange, banana);
cb.getSelectionModel().select(orange);
実行例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
import javafx.application.Application; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.ChoiceBox; import javafx.scene.layout.VBox; import javafx.stage.Stage; /** * 選択ボックスの各要素のクラス */ class Fruits { final String key; final String value; public Fruits( String key, String value ) { this.key = key; this.value = value; } /** * toStringメソッドで返した値が、選択ボックスの表示名として使われます */ @Override public String toString() { return value; } } public class Main extends Application { public static void main(String[] args){ Application.launch(args); } @Override public void start(Stage pStage) throws Exception { // 選択ボックスに表示するインスタンス Fruits apple = new Fruits( "001", "apple"); Fruits orange = new Fruits( "002", "orange"); Fruits banana = new Fruits( "003", "banana"); // ChoiceBox ChoiceBox<Fruits> cb = new ChoiceBox<>(); cb.getItems().addAll(apple, orange, banana); // デフォルトの選択肢を設定(要素で指定) cb.getSelectionModel().select(orange); // 配置 VBox vbRoot = new VBox(); vbRoot.setAlignment(Pos.CENTER); vbRoot.setSpacing(10); vbRoot.getChildren().addAll(cb); pStage.setTitle("選択ボックス"); pStage.setWidth(300); pStage.setHeight(200); pStage.setScene(new Scene(vbRoot)); pStage.show(); } } |