1
私はUIスクリーン上にいくつかのTextFieldを持っています。ボタンをクリックすると、選択したtextfieldの内容を取得したいと思います。JavaFXを使っていて、isFocused()メソッドが動作しません。JavaFXで選択したテキストフィールドの内容を取得
私はUIスクリーン上にいくつかのTextFieldを持っています。ボタンをクリックすると、選択したtextfieldの内容を取得したいと思います。JavaFXを使っていて、isFocused()メソッドが動作しません。JavaFXで選択したテキストフィールドの内容を取得
EventHandler
が実行される前に、フォーカスがButton
に移動します。これは、EventHandler
がプロパティをチェックするときには、TextField
がフォーカスされなくなったことを意味します。
あなたはしかしScene
のfocusOwner
財産に耳を傾け、最後Node
が集中救うことができる:
private static class FocusData {
private TextField textField = null;
public TextField getTextField() {
return textField;
}
public void setFocusedNode(Node node) {
this.textField = node instanceof TextField ? (TextField) node : null;
}
public boolean isTextField() {
return textField != null;
}
}
@Override
public void start(Stage primaryStage) {
final FocusData focusData = new FocusData();
Button btn = new Button("Print Text");
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
if (focusData.isTextField()) {
System.out.println(focusData.getTextField().getText());
}
}
});
VBox root = new VBox();
for (int i = 0; i < 5; i++) {
root.getChildren().add(new TextField());
}
Scene scene = new Scene(root);
scene.focusOwnerProperty().addListener(new ChangeListener<Node>() {
@Override
public void changed(ObservableValue<? extends Node> observable, Node oldValue, Node newValue) {
focusData.setFocusedNode(oldValue);
}
});
root.getChildren().add(btn);
primaryStage.setScene(scene);
primaryStage.show();
}
あなたはFXMLを使用している場合は、のscene
プロパティにリスナーを追加することによって、シーンへのアクセスを得ることができますinitialize
メソッド内のいくつかのノードを削除し、そのリスナ内のリスナを追加/削除します。
root
次のコードスニペットの一部のノードである:
final ChangeListener<Node> listener = new ChangeListener<Node>() {
@Override
public void changed(ObservableValue<? extends Node> observable, Node oldValue, Node newValue) {
focusData.setFocusedNode(oldValue);
}
};
if (root.getScene() != null) {
root.getScene().focusOwnerProperty().addListener(listener);
}
root.sceneProperty().addListener(new ChangeListener<Scene>() {
public void changed(ObservableValue<? extends Scene> observable, Scene oldValue, Scene newValue) {
if (oldValue != null) {
oldValue.focusOwnerProperty().removeListener(listener);
}
if (newValue != null) {
newValue.focusOwnerProperty().addListener(listener);
}
listener.changed(null, null, null);
}
});