【问题标题】:How to trigger the ChangeListener when TextField loses focus ? JAVAFXTextField失去焦点时如何触发ChangeListener? JAVAFX
【发布时间】:2018-01-08 05:21:20
【问题描述】:

我有多个TextFields,我正在尝试查找用户输入的数字的总和。

 credit1.textProperty().addListener(new creditChangeListener(this.credit1, this.course1, this.grade1));
 credit2.textProperty().addListener(new creditChangeListener(this.credit2, this.course2, this.grade2));
 credit3.textProperty().addListener(new creditChangeListener(this.credit3, this.course3, this.grade3));
 credit4.textProperty().addListener(new creditChangeListener(this.credit4, this.course4, this.grade4));

我有一个实现ChangeListener 的内部类来处理每个TextField 的用户输入。

 private class creditChangeListener implements ChangeListener<String>{

    private final TextField credit;
    private final TextField course;
    private final TextField grade;

    public creditChangeListener(TextField credit, TextField course, TextField grade){
        this.credit = credit;
        this.course = course;
        this.grade = grade;
    }

    @Override
    public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue){
        if(!credit.getText().matches("[0-9]+")) grade.setText("");
        if(!course.getText().isEmpty() && !grade.getText().isEmpty()) {
            addSum();
        }
    }

    private void addSum(){
        sum += Integer.parseInt(credit.getText());
        System.out.println("Current sum: " + sum);
    }
}

我需要找到输入到 credit TextFields 中的数字的总和,但是 ChangeListener 会逐位添加,而我需要输入整个数字。我想在TextFields 失去焦点后触发ChangeListener,但我不知道如何实现,也不确定这是正确的做法。

【问题讨论】:

标签: java javafx


【解决方案1】:

前段时间我遇到了同样的问题,我在 Focused 属性中添加了一个 Listener 而不是 Changed 属性解决了这个问题。首先创建一个可以重用的监听器:

private ChangeListener<Boolean> focusListener = new ChangeListener<Boolean>() {
    @Override
    public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
        if (!newValue) {
            sum(); //Do the sum logic here!!!
        }
    }
};

然后将更改侦听器应用于所有文本字段

credit1.focusedProperty().addListener(focusListener);
credit2.focusedProperty().addListener(focusListener);
credit3.focusedProperty().addListener(focusListener);
credit4.focusedProperty().addListener(focusListener);

您可以通过这种方式实现您的内部类,以便在每次 Textfield 失去焦点时触发事件。

希望对你有帮助...

【讨论】:

    猜你喜欢
    • 2020-05-27
    • 1970-01-01
    • 1970-01-01
    • 2014-11-15
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多