监听 FXML 中定义的 TextField 的变化

Mat*_*tti 2 javafx fxml javafx-8

我正在编写一个简单的登录 GUI,它由主容器 GridPane、接收用户昵称的 TextField 和最后一个登录按钮组成。

我用 FXML 结合 CSS 编写了 GUI 结构。

我想做的是保持登录按钮禁用,直到用户实际在文本字段中写入内容。我只能找到与此相关的答案,但我想知道将此侦听器放入 FXML 代码本身的最佳方法是什么,以便我可以在 FXML 控制器中获得更清晰的代码。

我尝试使用 onKeyTyped 方法,但这并没有完成工作,因为每当我在 TextField 中输入内容时我都没有得到任何响应。

这是我的 FXML 代码

<TextField fx:id="usernameTextField"
           promptText="Username"
           onKeyTyped="#userTyped"
           stylesheets="@loginStyle.css">
Run Code Online (Sandbox Code Playgroud)

实现这一目标的最佳方法是什么?

Jam*_*s_D 6

一般来说,如果您想在文本字段的文本发生更改时执行操作,您需要向文本字段注册一个侦听器textProperty(),您必须在控制器中执行此操作:

@FXML
private TextField usernameTextField ;

public void initialize() {
    usernameTextField.textProperty().addListener((obs, oldText, newText) -> {
        // do what you need with newText here, e.g.
        loginButton.setDisable(newText.isEmpty());
    });
}
Run Code Online (Sandbox Code Playgroud)

但是,如果您需要的只是将一个控件中的属性绑定到另一个控件中的属性(或该属性的一些简单依赖项),则可以使用FXML 表达式绑定

@FXML
private TextField usernameTextField ;

public void initialize() {
    usernameTextField.textProperty().addListener((obs, oldText, newText) -> {
        // do what you need with newText here, e.g.
        loginButton.setDisable(newText.isEmpty());
    });
}
Run Code Online (Sandbox Code Playgroud)

这是一个 SSCCE:

ButtonDisableTest.fxml

<TextField fx:id="usernameTextField"/>
<Button text="Login" disable="${usernameTextField.text.empty}" />
Run Code Online (Sandbox Code Playgroud)
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class ButtonDisableTest extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("ButtonDisableTest.fxml"));
        Scene scene = new Scene(root, 400, 400);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述