监听 FXML 中定义的 TextField 的变化
Listen to changes in TextField defined in FXML
我正在编写一个简单的登录 GUI,它由作为主容器的 GridPane 组成,然后是一个包含用户昵称的 TextField,最后是一个登录按钮。
我结合CSS用FXML写了GUI结构。
我想做的是保持登录按钮处于禁用状态,直到用户实际在 TextField 中写了一些东西。我只能找到与此相关的答案,但我想知道将此 Listener 放入 FXML 代码本身的最佳方法是什么,以便我可以在 FXML 控制器中获得更清晰的代码。
我尝试使用 onKeyTyped 方法,但它没有起作用,因为我在 TextField 中输入时没有任何反应。
这是我的 FXML 代码
<TextField fx:id="usernameTextField"
promptText="Username"
onKeyTyped="#userTyped"
stylesheets="@loginStyle.css">
实现此目标的最佳方法是什么?
让我们假设您的登录按钮有一个 fx:id="loginButton" 并且它被禁用了
@FXML
public void userTyped(KeyEvent event) {
loginButton.setDisable(false);
}
一般来说,如果您想在文本字段的文本更改时执行某个操作,您需要使用文本字段的 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);
}
}
这是一个老问题,但如果您想要 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
我正在编写一个简单的登录 GUI,它由作为主容器的 GridPane 组成,然后是一个包含用户昵称的 TextField,最后是一个登录按钮。
我结合CSS用FXML写了GUI结构。
我想做的是保持登录按钮处于禁用状态,直到用户实际在 TextField 中写了一些东西。我只能找到与此相关的答案,但我想知道将此 Listener 放入 FXML 代码本身的最佳方法是什么,以便我可以在 FXML 控制器中获得更清晰的代码。
我尝试使用 onKeyTyped 方法,但它没有起作用,因为我在 TextField 中输入时没有任何反应。
这是我的 FXML 代码
<TextField fx:id="usernameTextField"
promptText="Username"
onKeyTyped="#userTyped"
stylesheets="@loginStyle.css">
实现此目标的最佳方法是什么?
让我们假设您的登录按钮有一个 fx:id="loginButton" 并且它被禁用了
@FXML
public void userTyped(KeyEvent event) {
loginButton.setDisable(false);
}
一般来说,如果您想在文本字段的文本更改时执行某个操作,您需要使用文本字段的 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);
}
}
这是一个老问题,但如果您想要 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