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]
スポンサーリンク