我正在编写一个简单的登录GUI,它由GridPane(主容器)组成,然后是TextField,它接收用户昵称,最后是一个登录按钮。
我在FXML中结合CSS编写了GUI结构。
我想要做的是保持登录按钮被禁用,直到用户在TextField中实际写入内容为止。我只能找到与此相关的答案,但我想知道将此Listener放入FXML代码本身的最佳方法是什么,以便我可以在FXML控制器中获得更清晰的代码。
我尝试使用onKeyTyped方法,但是没有完成工作,因为每当我在TextField中输入时都没有响应。
这是我的FXML代码
<TextField fx:id="usernameTextField"
promptText="Username"
onKeyTyped="#userTyped"
stylesheets="@loginStyle.css">
实现这一目标的最佳方法是什么?
答案 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);
}
}
答案 2 :(得分:0)
让我们假设您的登录按钮有一个fx:id =“loginButton”并且已被禁用
@FXML
public void userTyped(KeyEvent event) {
loginButton.setDisable(false);
}