【问题标题】:Real-time JavaFX-8 Form Management实时 JavaFX-8 表单管理
【发布时间】:2017-03-14 06:07:38
【问题描述】:

好的,这是我的困境。我正在尝试使用 TextFields 和其他元素创建一个 JavaFX 表单。但是现在,我需要知道如何实现一个实时填写的表单。

理论上,例如假设我有两个 TextField。

TextField textfield1 = new TextField();
TextField textfield2 = new TextField();

第二个文本字段取决于在第一个文本字段中输入的任何值。一旦用户在第一个上完成输入,第二个就会被填充一个值。

if(!textfield.getText().equals("")) {
    textfield2.setText("blah, blah, blah");
}

举一个真实的例子,假设我正在制作一个工资单系统。 用户输入员工的基本工资(在第一个文本字段中),然后输入员工月薪的值:基本工资 * 2(在第二个文本字段中)。

第二个是不可编辑的,只有第一个是。很确定我需要在第一个字段上使用某种事件处理程序,但我真的对如何编写或编写什么代码感到困惑。顺便说一句,我是 JavaFX 的新手。任何帮助将不胜感激。

更新:我在这个上使用了 Scenebuilder(对不起,我忘了包括那个)。因此,每个元素的侦听器都被分组到控制器中定义的函数中。自从我废弃 Swing(和 Windowbuilder),顺便使用 Eclipse 后,使用内部类对我来说感觉很奇怪。我想保持代码约定全面一致。

【问题讨论】:

  • “一旦用户在第一个上完成输入”......所以没有更新你继续......可能失去焦点?
  • 这也是我的假设,因为表单上的标签顺序很常见。我的问题是实施。我一生都无法理解,到目前为止,我只需要处理按钮和组合框事件,这在场景构建器上非常容易。

标签: java javafx-8 real-time textfield


【解决方案1】:

我相信您在问如何实现焦点丢失侦听器。这演示了如何将更改侦听器添加到第一个文本字段的 focusProperty() 并使用它来触发第二个文本字段的更新。

这可以通过将逻辑放在@FXML 带注释的initialize() 方法中来在控制器内完成。在注入所有 @FXML 注释字段后,JavaFX 会自动调用它。

public class Controller {
    @FXML
    private TextField textfield1;
    @FXML
    private TextField textfield2;

    @FXML
    public void initialize() {
        textfield1.focusedProperty().addListener((obs, oldValue, newValue) -> {
            if (!newValue) { // focus lost
                if (!"".equals(textfield1.getText())) {
                    textfield2.setText("blah, blah, blah");
                } else {
                    textfield2.setText("");
                }
            }
        });
    }
}

【讨论】:

  • 这是一个相当大的项目,所以启动方法已经很深,远离这个问题所在。我正在使用 Scenebuilder (请参阅更新的问题),所以我想让听众特定于控制器。不幸的是,Scenebuilder 上没有焦点监听器(我希望他们确实实现了)。所以内部类不在讨论范围内。
  • @Ace_01S 我的示例旨在实现自包含和可运行,这是我包含 start 方法的唯一原因。您的问题给出了“TextField textfield1 = new TextField();”的示例这让我误以为你没有使用 SceneBuilder。我会更新我的答案。
  • @Ace_01S 查看有关如何在控制器中手动添加焦点侦听器的答案更新...
  • 天哪,非常感谢您! ...初始化那个小东西。我只用它来向组合框添加条目。将在表格的其他部分使用它。 (其实是一个很大的表格,每个部门都有这个问题,我最终会复制它们)。
猜你喜欢
  • 1970-01-01
  • 2021-09-16
  • 1970-01-01
  • 2018-06-03
  • 1970-01-01
  • 2013-05-05
  • 2019-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多