我正在编写一个简单的登录 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);
}
}
关于javafx - 监听 FXML 中定义的 TextField 的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49798254/