javafx - 监听 FXML 中定义的 TextField 的变化

标签 javafx javafx-8 fxml

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

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

我想做的是保持登录按钮处于禁用状态,直到用户实际在 TextField 中写入内容。我只能找到与此相关的答案,但我想知道将此 Listener 放入 FXML 代码本身的最佳方法是什么,以便我可以在 FXML Controller 中获得更清晰的代码。

我尝试使用 onKeyTyped 方法,但它没有起作用,因为每当我在 TextField 中输入时,我都没有得到任何响应。

这是我的 FXML 代码

<TextField fx:id="usernameTextField"
           promptText="Username"
           onKeyTyped="#userTyped"
           stylesheets="@loginStyle.css">

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

最佳答案

一般来说,如果你想在文本字段的文本发生变化时执行一个 Action ,你需要用文本字段的 textProperty() 注册一个监听器,你必须在 Controller :

@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());
    });
}

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

<TextField fx:id="usernameTextField"/>
<Button text="Login" disable="${usernameTextField.text.empty}" />

这是一个 SSCCE:

ButtonDisableTest.fxml:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.layout.VBox?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.control.Button?>

<VBox alignment="CENTER" spacing="5" xmlns:fx="http://javafx.com/fxml/1">
    <TextField fx:id="usernameTextField"/>
    <Button text="Login" disable="${usernameTextField.text.empty}" />
</VBox>
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);
    }
}

enter image description here

关于javafx - 监听 FXML 中定义的 TextField 的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49798254/

相关文章:

java - 使用 List<String> 填充 Java FX 组合框

java - 开发多线程Javafx应用需要注意什么?

JavaFX动态添加按钮

java - 如何访问由构造函数创建的对象变量

java - 将 FXML 文件添加到 ControlsFX 弹出窗口中

javafx.fxml.LoadException 和 JavaFX SceneBuilder

resize - JavaFX - SplitPane,调整大小和比例

JavaFX 按升序显示单词

javafx - JavaFX 中的堆叠图表

JavaFX 检查事件的 KeyCode 是否为数字键