2017-08-01 53 views
1

我有多個TextFields,我試圖找到用戶輸入到他們的數字的總和。如何在TextField失去焦點時觸發ChangeListener? JAVAFX

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,但我無法找到如何實現這一點,我也不確定這是否是正確的做法。

+1

這可以幫助你:[事件時窗口/階段失去焦點(https://stackoverflow.com/questions/24038988/event-when-window-stage-lost-焦點) –

+0

你想在哪一點執行總和的計算?程序如何知道用戶完成輸入文本的時間? – user1803551

回答

2

前段時間我有同樣的問題,我解決了它添加一個Listener到Focused屬性而不是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失去焦點時觸發事件。

希望它可以幫助...

+0

謝謝!按預期工作 –