【问题标题】:Returning a node from a cell on GridPane. (JavaFX)从 GridPane 上的单元格返回一个节点。 (JavaFX)
【发布时间】:2018-03-15 14:11:46
【问题描述】:

我有一个学校项目或类似的东西,我正在尝试为用户制作一个注册面板。当用户单击注册时,此面板会打开。看起来像这样。

我想要做的是禁用该创建按钮,并且只有在对话框上有 3 个检查时才会启用它。

我在 Dialog 上使用 GridPane,我正在考虑在这些单元格中返回那些特定的节点(检查是 ImageViews)并检查条件是否为真。但是,我不知道如何从 GridPane 返回节点。如果您对这个问题有任何其他方法,那也很好。

这是代码的相关部分。

public void SignUp(){

    //Create the custom dialog.
    Dialog signUpDialog = new Dialog();
    //Dialog Title
    signUpDialog.setTitle("Sign Up");

    //Setting "OK" button type.
    ButtonType buttonTypeCreate = new ButtonType("Create", ButtonBar.ButtonData.OK_DONE);
    //Adding Button types.
    signUpDialog.getDialogPane().getButtonTypes().addAll(buttonTypeCreate, ButtonType.CANCEL);

    //Creating the GridPane.
    GridPane gridPane = new GridPane();
    gridPane.setHgap(10);
    gridPane.setVgap(10);
    gridPane.setPadding(new Insets(20, 150, 10, 10));

    //Setting the Check Icon.
    Image imageCheck = new Image("resources/check_icon.png");
    //Setting 3 different ImageViews for Check Icon because can't add duplicates to GridPane.
    ImageView imageViewCheck1 = new ImageView(imageCheck);
    ImageView imageViewCheck2 = new ImageView(imageCheck);
    ImageView imageViewCheck3 = new ImageView(imageCheck);

    //Setting the X Icon.
    Image imageX = new Image("resources/x_icon.png");
    //Setting 3 different ImageViews for X Icon because can't add duplicates to GridPane.
    ImageView imageViewX1 = new ImageView(imageX);
    ImageView imageViewX2 = new ImageView(imageX);
    ImageView imageViewX3 = new ImageView(imageX);

    //TextField for User ID.
    TextField textFieldDialogUserID = new TextField();
    textFieldDialogUserID.setPromptText("User ID");
    textFieldDialogUserID.setAlignment(Pos.CENTER_RIGHT);

    //PasswordField for Password.
    PasswordField passwordFieldDialogPassword = new PasswordField();
    passwordFieldDialogPassword.setPromptText("Password");
    passwordFieldDialogPassword.setAlignment(Pos.CENTER_RIGHT);

    //PasswordField for Confirm Password.
    PasswordField passwordFieldDialogConfirmPassword = new PasswordField();
    passwordFieldDialogConfirmPassword.setPromptText("Confirm Password");
    passwordFieldDialogConfirmPassword.setAlignment(Pos.CENTER_RIGHT);

    gridPane.add(new Label("User ID"), 0, 0);
    gridPane.add(textFieldDialogUserID, 1, 0);

    gridPane.add(new Label("Password"), 0, 1);
    gridPane.add(passwordFieldDialogPassword, 1, 1);

    gridPane.add(new Label("Confirm Password"), 0, 2);
    gridPane.add(passwordFieldDialogConfirmPassword, 1, 2);

    gridPane.add(imageViewX1,2,0);
    gridPane.add(imageViewX2,2,1);
    gridPane.add(imageViewX3,2,2);


    signUpDialog.getDialogPane().setContent(gridPane);

    Stage signUpStage = (Stage) signUpDialog.getDialogPane().getScene().getWindow();
    signUpStage.getIcons().add(new Image("resources/application_icon.png"));

    Optional<Pair<String, String>> result = signUpDialog.showAndWait();


}

【问题讨论】:

  • 您可以使用绑定,也可以创建一个布尔方法来检查用户 ID 的 TextField 是否有最小长度。此布尔方法还应检查两个密码TextFields 是否具有最小长度且相等。然后在您的三个TextFields'onkeyReleased 中,您可以执行以下操作:yourButton.disableProperty().set(yourBooleanCheckMethod()); 您的按钮应该从一开始就设置为禁用。
  • 是的,我为每个 TextField 使用了 3 个布尔值,例如锁,当满足条件时它们将是真的。它工作正常,但问题仍然没有得到解答。

标签: java user-interface javafx gridpane


【解决方案1】:

创建一个适当的BooleanBinding,它表示何时应该禁用该按钮。您可以使用Bindings 实用程序类来创建表达式,包括比较、ands 和 ors。为了使代码更具可读性,请对函数进行静态导入。

从面板中获取创建按钮并将布尔表达式绑定到按钮的disable 属性。

如果任何值发生更改,JavaFX 框架将自动重新评估绑定并相应地更新按钮的状态。

import static javafx.beans.binding.Bindings.*;

BooleanBinding notComplete = or(
  equal(textFieldDialogUserID.textProperty(), null),
  equal(passwordFieldDialogPassword.textProperty(), null));

Node createButton = signUpDialog.getDialogPane().lookupButton(buttonTypeCreate);
createButton.disableProperty().bind(notComplete);

您可以使用相同的机制来控制每个复选标记的可见性。为每个文本字段创建一个“不完整”BooleanBinding 并将其与not 绑定绑定到复选标记的visible 属性。在复合 or 中使用所有这些 BooleanBindings 来确定按钮状态。这样按钮状态和复选标记将始终保持同步。

【讨论】:

  • 除了我使用布尔变量而不是布尔绑定之外,我所做的一切都是一样的。有什么区别?值得改变吗?
  • 是的:绑定(不仅是布尔绑定)是 JavaFX 中的 方法,可让您的用户界面与数据模型保持同步和一致。
【解决方案2】:

我不知道如何从 GridPane 返回节点。

    gridPane.getChildren() 

提供节点列表,但您已经拥有组件textFieldDialogUserIDpasswordFieldDialogPasswordpasswordFieldDialogConfirmPassword

=> 为它们中的每一个添加一个动作监听器,当它的值改变时检查值。根据结果​​,启用/禁用“创建”按钮(默认情况下,它应该被禁用)。

你可以举个例子:http://docs.oracle.com/javafx/2/ui_controls/text-field.htm

【讨论】:

  • 我已经在这 3 个字段上有了 ChangeListener,但没有发布那部分,因为它太乱了。首先我是这样做的(输入更改后启用/禁用按钮)。这种方法的问题是在某些情况下,即使没有 3 次检查,也可以启用 Create Button。所以我必须在 3 次检查后启用它。
  • 我要问的是这样的; if(第 2 行的节点==checkImage){启用按钮}
  • 对不起,我不明白你的评论。您是否使用了一种通用的验证方法来检查这 3 个字段的值?
  • 是的,我做到了。 TextFields 及其 OnChange 方法工作正常。我对他们没有问题。但是在这些方法中禁用/启用创建按钮有一些问题,所以我试图在通过查看检查图标调用这些方法之后启用按钮。
  • 检查图像不是一个好主意(它是一种 hack,难以维护)。首选链接绑定:stackoverflow.com/questions/23040531/…stackoverflow.com/questions/23040531/…
猜你喜欢
  • 2018-12-20
  • 2015-09-17
  • 2016-01-27
  • 2014-01-06
  • 2021-11-04
  • 1970-01-01
  • 2011-04-03
  • 1970-01-01
  • 2018-06-16
相关资源
最近更新 更多