我的UI屏幕上有很多TextFields,点击按钮我想获取所选textfield的内容。我使用JavaFX并且isFocused()方法无法正常工作
答案 0 :(得分:0)
焦点在Button
运行之前移至EventHandler
。这意味着TextField
在EventHandler
检查财产时不再关注focusOwner
您可以收听Scene
的{{1}}属性,并保存上一个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);
}
});