JavaFX チュートリアル〜今度こそ、初めてでも大丈夫6:CheckBox〜

イントロダクション

以前記載した記事で「初めてでも大丈夫」などと記載していましたが、ちょっと「危ういな」と思いチュートリアルをやってみようとなりました。

今回はチェックボックスの表示をやります。

チュートリアル

ここのページを、戦国Xサラの要領でガンガン斬り伏せながらやっていきます。

<チュートリアル>

基本のコード

/**
 * OracleのJavaFXチュートリアル。
 * ToggleButton表示します。
 * JavaDocです。このクラスは「@see」に記載しているサイトの
 * チュートリアルをやります。このクラスではLabelクラスの使用法を実行します。
 * 
 * @author takunoji
 * @see https://docs.oracle.com/javase/jp/8/javafx/user-interface-tutorial/checkbox.htm#CHDFEJCD
 * 2019/03/14
 */
public class Lv5_CheckBox extends Application {

	/**
	 * このメソッドは、Applicationクラス(JavaFXのフレームワーク部品)
	 * のメソッドをオーバーライドする。
	 * {@link Application#launch(String...)}から呼び出される。
	 */
	@Override
	public void start(Stage primaryStage) throws Exception {
		// チュートリアルの乗っていない部分
		Group group = new Group();
		VBox virtical = new VBox();
		HBox horizonal = new HBox();

		/* チュートリアルにあるコード */
		//A checkbox without a caption
		CheckBox cb1 = new CheckBox();
		//A checkbox with a string caption
		CheckBox cb2 = new CheckBox("Second");

		cb1.setText("First");
		cb1.setSelected(true);

		// Groupにチェックボックスを追加する
		group.getChildren().addAll(cb1, cb2);
		// チュートリアルでは省略されている
		virtical.getChildren().addAll(cb1, cb2);
		// チェックボックスの表示領域
		horizonal.getChildren().add(virtical);
		// イメージの表示領域
		Label iconSpace = new Label("Icon Space");
		iconSpace.setBackground(new Background(new BackgroundFill(Color.BLACK, new CornerRadii(5), Insets.EMPTY)));
		horizonal.getChildren().add(iconSpace);
		group.getChildren().add(horizonal);

		// 毎度おなじみのコード(この部分はだいたい同じになる)
		Scene scene = new Scene(group, 300, 300);
		primaryStage.setScene(scene);
		primaryStage.setTitle("チュートリアル6");
		primaryStage.show();
	}

	/**
	 * メインメソッド。
	 * Apllicationクラスのlaunchメソッドを呼び出す。
	 * 
	 * @param args プログラム引数
	 */
	public static void main(String[] args) {
		launch(args);
	}
}

<実行結果>

この基本のコードを基準にします。

このコードは単純にチェックボックスと、イメージを表示するための背景ラベルを表示します。処理を説明すると以下のようになります。

  1. Groupを使用して最終的に表示するコンテナを作成します。
  2. VBoxで縦、HBoxで横のレイアウト用コンテナを作成。
  3. CheckBoxを2つ作成し、FirstとSecondと名前をつけます。
  4. Firstのチェックボックスに選択済みフラグをTrueに設定します。

そして作成したコンポーネント(画面の部品)をGroup(コンテナ)へ追加して表示しています。

 

そして最終的にできたコードです。

/**
 * このメソッドは、Applicationクラス(JavaFXのフレームワーク部品)
 * のメソッドをオーバーライドする。
 * {@link Application#launch(String...)}から呼び出される。
 */
@Override
public void start(Stage primaryStage) throws Exception {
	// チュートリアルの乗っていない部分
	Group group = new Group();
	VBox virtical = new VBox();
	HBox horizonal = new HBox();

	/* チュートリアルにあるコード */
	//A checkbox without a caption
	CheckBox cb1 = new CheckBox();
	//A checkbox with a string caption
	CheckBox cb2 = new CheckBox("Second");

	cb1.setText("First");
	cb1.setSelected(true);

	// CheckBoxの動きの設定
	final String[] names = new String[]{"ore", "min", "twit"};
	final Image[] images = new Image[names.length];
	final ImageView[] icons = new ImageView[names.length];
	final CheckBox[] cbs = new CheckBox[names.length];

	// イメージ用のグループ
	Group gp = new Group();
	for (int i = 0; i < names.length; i++) {
	    final Image image = images[i] =
	        new Image("/" + names[i] + ".png");
	    final ImageView icon = icons[i] = new ImageView();
	    gp.getChildren().add(icon);
	    final CheckBox cb = cbs[i] = new CheckBox(names[i]);
	    cb.selectedProperty().addListener(
	        (ObservableValue<? extends Boolean> ov,
	            Boolean old_val, Boolean new_val) -> {
	                icon.setImage(new_val ? image : null);
	    });
	    virtical.getChildren().add(cb);
	}
	// Groupを追加する
//		group.getChildren().addAll(cb1, cb2);
	// チュートリアルでは省略されている
	virtical.getChildren().addAll(cb1, cb2);
	// チェックボックスの表示領域
	horizonal.getChildren().add(virtical);
	// イメージの表示領域
	Label iconSpace = new Label("Icon Space");
	iconSpace.setBackground(new Background(new BackgroundFill(Color.BLACK, new CornerRadii(5), Insets.EMPTY)));
	horizonal.getChildren().add(gp);
	group.getChildren().add(horizonal);

	// 毎度おなじみのコード(この部分はだいたい同じになる)
	Scene scene = new Scene(group, 300, 300);
	primaryStage.setScene(scene);
	primaryStage.setTitle("チュートリアル6");
	primaryStage.show();
}

チュートリアルに乗っている部分をコピーしています。

実行結果は以下のようになります。

イベント処理を追加するときは「〜Property」を使用するようですね(笑)