检查在javafx中选择了哪个文本框

时间:2018-06-13 22:21:42

标签: javafx

我有一个带有多个文本框的javafx应用程序,用户可以在其中输入信息。我还在应用程序中内置了一个键盘,按下时将该文本添加到文本框中。

我的问题是,由于我有多个文本框,因此我不知道将按钮文本添加到哪个文本框中。在javafx中是否有办法检查用户是否点击了某个文本框,以便检查哪一个已被选中并在那里添加文本?

2 个答案:

答案 0 :(得分:5)

您可以使用活动场景的Scene.focusOwner属性来获取焦点节点。检查,如果它是TextInputControl并调用相应按钮单击的方法。请注意,如果该按钮的focusTraversabletrue,则点击按钮可能会移动焦点。 (默认情况下就是这种情况。)

@Override
public void start(Stage primaryStage) {
    GridPane grid = new GridPane();
    final Scene scene = new Scene(grid);

    for (int i = 0; i < 4; i++) {
        grid.add(new TextField(), 0, i);

        final String buttonValue = Character.toString((char) ('a'+i));
        Button button = new Button(buttonValue);
        button.setFocusTraversable(false); // prevent buttons from stealing focus
        button.setOnAction(evt -> {
            Node fo = scene.getFocusOwner();
            if (fo instanceof TextInputControl) {
                ((TextInputControl) fo).replaceSelection(buttonValue);
            }
        });
        grid.add(button, 1, i);
    }


    primaryStage.setScene(scene);
    primaryStage.show();
}

答案 1 :(得分:2)

您应该为每个TextField focusProperty创建一个监听器,并设置一个实例变量。

一旦您拥有对当前焦点的TextField的全局引用,您就可以对其进行任何处理。

这是一个快速的应用程序来演示。我在代码中包含了一些额外的细节:

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;


public class Main extends Application {

    // Instance variable to hold the currently-selected TextField
    private TextField selectedTextField;

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {

        // Create TextFields
        TextField txt1 = new TextField();
        TextField txt2 = new TextField();
        TextField txt3 = new TextField();
        TextField txt4 = new TextField();

        // This method sets the same change listener on each textfield
        installListener(txt1, txt2, txt3, txt4);

        VBox pane = new VBox(5);
        pane.setPadding(new Insets(5));

        // Add the TextFields to the layout
        pane.getChildren().addAll(
                new HBox(5, new Label("Txt1: "), txt1),
                new HBox(5, new Label("Txt2: "), txt2),
                new HBox(5, new Label("Txt3: "), txt3),
                new HBox(5, new Label("Txt4: "), txt4)
        );

        primaryStage.setScene(new Scene(pane));
        primaryStage.show();
    }

    // Accepts multiple TextFields
    private void installListener(TextField... textFields) {

        // Install the same listener on all of them
        for (TextField textField : textFields) {
            textField.focusedProperty().addListener((observableValue, oldValue, newValue) -> {

                // Set the selectedTextField to null whenever focus is lost. This accounts for the 
                // TextField losing focus to another control that is NOT a TextField
                selectedTextField = null;

                if (newValue) {
                    // The new textfield is focused, so set the global reference
                    selectedTextField = textField;
                    System.out.println("Selected Text: " + selectedTextField.getText());
                }
            });
        }
    }
}