非IT企業に勤める中年サラリーマンのIT日記

非IT企業でしかもITとは全く関係ない部署にいる中年エンジニア。唯一の趣味がプログラミングという”自称”プログラマー。

JavaFX:FXMLで書いたコントロールをJava側から制御する方法

   

前回、FXMLで作ったUIのイベント処理する方法について書きました。

この時つくったやつは、OKボタンを押すとコンソールに「OK」と表示されます。

 

今度は、OKボタンを押したら、「Hello World」と書かれたLabelコントロールに「OK」と書き換えるようにしたいと思います。

前回との違いは、FXMLで記述したコントロールをJava側からどう制御するか?といった点です。Java側でFXMLコントロールをどう認識するかがポイントです。

[ad#top-1]

まずは実行例

OKボタンを押すと、Labelに書かれた「Hello World」が「OK」に切り替わるという単純なプログラムです。

 

イベント処理はもちろんJava側で行います。どうやってLabelコントロールを制御するかがポイントです。

FXML側の処理

まずは、FXML側の処理を行います。

今までだと各コントロールを認識する固有のIDがないため、それを設定します。

Scene Builderで、Labelコントロールを選択した上で、の右サイドの「Code」メニューから、「fxid」のところに固有の名称を書きます。今回は「label」としました。

 

FXMLファイルをエディタで確認してみると、Labelタグのところに「fx:id=”label”」が追加されていることがわかります。

 

Java側の処理

次にJava側の処理です。

前回のプログラムから追加されたところにコメントで「追加」と明示しておきました。

import javafx.application.Application;
import javafx.fxml.*;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.scene.layout.AnchorPane;
import javafx.event.ActionEvent;
import javafx.scene.control.*; //追加

public class Hello extends Application {
  @FXML private Label label; //追加

  @Override
  public void start(Stage primaryStage) throws Exception{
    AnchorPane root = FXMLLoader.load(getClass().getResource("Hello.fxml"));
    primaryStage.setTitle("Hello World");
    primaryStage.setScene(new Scene(root, 400, 100));
    primaryStage.show();
  }

  public static void main(String[] args) {
    launch(args);
  }

  @FXML
  public void clickBtn(ActionEvent e) {
    System.out.println("OK");
    label.setText("OK"); //追加
  }
}
 

 

ポイントは10行目の「@FXML private Label label;」という部分です。ここの「label」というインスタンス名は、先ほどFXMLで設定した「fxid」名と同じにする必要があります。

これで、FXMLのLabelコントロールが、Java側でlabelとして使用できるわけです。あとはLabelクラスの機能が使えます。

注意すべきはfxidの名称を重複させないことです。前に書いた通り、FXML上のミスはコンパイル時に発見できないので、エラーを探すのに難航しますので。

[ad#ad-1]

スポンサーリンク

 - Java