2017-08-01 14 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)); 

私は、各TextFieldに対するユーザの入力を処理するためにChangeListenerを実装する内部クラスを持っています。

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); 
    } 
} 

は、私は私が全体の番号が入力された必要ながら、しかしChangeListenerは桁ごとを追加し、それらのcredit TextFieldsに入力された数字の合計を見つける必要があります。 TextFieldsがフォーカスを失った後にChangeListenerをトリガすることを考えましたが、それを達成する方法を見つけることができなかったし、それを行う正しい方法ではないと確信しています。

+1

...それがお役に立てば幸い:[ウィンドウ/ステージが失われたイベントは、フォーカス](https://stackoverflow.com/questions/24038988/event-when-window-stage-lost-フォーカス) –

+0

どの時点で合計の計算を実行しますか?ユーザーがテキストの入力を完了したとき、プログラムはどのように知るべきですか? – user1803551

答えて

2

私は同じ問題を抱えていましたが、私はそれを解決しました。これはListedを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!!! 
     } 
    } 
}; 

を次にあなたがイベントにTextfieldがフォーカスを失ったすべての時間をトリガするために、あなたの内部クラスをこのように実装することができ、すべてのテキストフィールド

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

に変更リスナーを適用します。まず、あなたが再利用できるリスナーを作成します。

これはあなたを助けるかもしれない

+0

ありがとう!意図どおりに動作する –

関連する問題