聆听FXML中定义的TextField中的更改

时间:2018-04-12 13:46:04

标签: javafx javafx-8 fxml

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

我在FXML中结合CSS编写了GUI结构。

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

我尝试使用onKeyTyped方法,但是没有完成工作,因为每当我在TextField中输入时都没有响应。

这是我的FXML代码

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

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

3 个答案:

答案 0 :(得分:2)

这是一个老问题,但如果您想要 TextField 的侦听器,您可以通过 FXML 在 initialize() 中无需任何代码即可完成此操作。

将带有处理程序的 onTextChange 属性添加到您的 TextField:

<TextField fx:id="usernameTextField"
                   promptText="Username"
                   onTextChange="#userTyped">

在 FXML 中,然后在您的控制器中有一个方法:

public void userTyped(StringProperty property, String oldValue, String newValue) {
    // do stuff
}

(请注意,如果您只想禁用按钮,James_D 对表达式绑定的回答会更清晰)

您可以查看 here 以获取有关此内容的官方文档。

答案 1 :(得分:1)

通常,如果要在文本字段的文本发生更改时执行操作,则需要使用文本字段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());
    });
}

但是,如果您只需要将一个控件中的属性绑定到另一个控件中的属性(或该属性的某个简单依赖项),则可以使用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

答案 2 :(得分:0)

让我们假设您的登录按钮有一个fx:id =“loginButton”并且已被禁用

@FXML
public void userTyped(KeyEvent event) {
    loginButton.setDisable(false);
}