Mat*_*tti 2 javafx fxml javafx-8
我正在编写一个简单的登录 GUI,它由主容器 GridPane、接收用户昵称的 TextField 和最后一个登录按钮组成。
我用 FXML 结合 CSS 编写了 GUI 结构。
我想做的是保持登录按钮禁用,直到用户实际在文本字段中写入内容。我只能找到与此相关的答案,但我想知道将此侦听器放入 FXML 代码本身的最佳方法是什么,以便我可以在 FXML 控制器中获得更清晰的代码。
我尝试使用 onKeyTyped 方法,但这并没有完成工作,因为每当我在 TextField 中输入内容时我都没有得到任何响应。
这是我的 FXML 代码
<TextField fx:id="usernameTextField"
promptText="Username"
onKeyTyped="#userTyped"
stylesheets="@loginStyle.css">
Run Code Online (Sandbox Code Playgroud)
实现这一目标的最佳方法是什么?
一般来说,如果您想在文本字段的文本发生更改时执行操作,您需要向文本字段注册一个侦听器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());
});
}
Run Code Online (Sandbox Code Playgroud)
但是,如果您需要的只是将一个控件中的属性绑定到另一个控件中的属性(或该属性的一些简单依赖项),则可以使用FXML 表达式绑定:
@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());
});
}
Run Code Online (Sandbox Code Playgroud)
这是一个 SSCCE:
ButtonDisableTest.fxml:
<TextField fx:id="usernameTextField"/>
<Button text="Login" disable="${usernameTextField.text.empty}" />
Run Code Online (Sandbox Code Playgroud)
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);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5526 次 |
| 最近记录: |