在JavaFX中获取所选文本字段的内容

时间:2016-12-28 13:58:26

标签: javafx-2 scenebuilder

我的UI屏幕上有很多TextFields,点击按钮我想获取所选textfield的内容。我使用JavaFX并且isFocused()方法无法正常工作

1 个答案:

答案 0 :(得分:0)

焦点在Button运行之前移至EventHandler。这意味着TextFieldEventHandler检查财产时不再关注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);
    }
});