ボタンイベントで TextField の値を取得する JavaFX
やりたいこと
- TextField が 2 つある
- Button が 1 つある
- Button を押下すると TextField に入力された値が標準出力される
- TextField に値を入力しない > ボタン押下 > NullPointerException
気にしない
- TextField に値を入力しない > ボタン押下 > NullPointerException
環境
パッケージ構成
src | usersettings | |--main.fxml |--mainController.java |--Usersettings.java
main.fxml
Designer でのイメージ
ソースレベル
<?xml version="1.0" encoding="UTF-8"?> <?import java.lang.*?> <?import javafx.scene.control.*?> <?import javafx.scene.layout.*?> <?import javafx.scene.text.*?> <AnchorPane id="AnchorPane" prefHeight="200" prefWidth="320" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="usersettings.mainController"> <children> <Button fx:id="button" layoutX="135.0" layoutY="160.0" onAction="#handleButtonAction" text="Login" /> <Text layoutX="27.0" layoutY="71.0" strokeType="OUTSIDE" strokeWidth="0.0" text="name" /> <TextField fx:id="fieldName" layoutX="79.0" layoutY="53.0" /> <Text layoutX="29.0" layoutY="125.0" strokeType="OUTSIDE" strokeWidth="0.0" text="pass" /> <TextField fx:id="fieldPass" layoutX="79.0" layoutY="107.0" /> </children> </AnchorPane>
mainController.java
package usersettings; import java.net.URL; import java.util.ResourceBundle; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.control.TextField; /** * * @author matsukawa */ public class mainController implements Initializable { @FXML private TextField fieldName; @FXML private TextField fieldPass; @FXML private void handleButtonAction(ActionEvent event) { System.out.println(this.fieldName); System.out.println(this.fieldPass); } @Override public void initialize(URL url, ResourceBundle rb) { } }
- アノテーションはフィールドごとに宣言する
@FXML private TextField fieldName; private TextField fieldPass;
こうすると fieldPass
はアノテーション宣言されぬ単なる属性になる
→ どんなイベントが実行されても null を固定参照し、意図せぬ挙動へ
Usersettings.java
package usersettings; import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.stage.Stage; /** * * @author matsukawa */ public class Usersettings extends Application { @Override public void start(Stage stage) throws Exception { Parent root = FXMLLoader.load(getClass().getResource("main.fxml")); Scene scene = new Scene(root); stage.setScene(scene); stage.show(); } /** * @param args the command line arguments */ public static void main(String[] args) { launch(args); } }
run して name と pass の TextField に値を入力 > Login ボタンを押下
入力値が標準出力される