JavaFX focusProperty (). Код рефактора addListener - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть текстовые поля в форме, где я выполняю действие, когда поле не в фокусе.У меня есть отдельный код слушателя для каждого поля, и мне было интересно, как я могу объединить этот код так, чтобы был один код слушателя для всех полей, так как у меня есть дублирование кода, и отличается только имя текстового поля.

@Override
    public void initialize(URL url, ResourceBundle rb) {


        callPremium.focusedProperty().addListener(new ChangeListener<Boolean>()
        {
            @Override
            public void changed(ObservableValue<? extends Boolean> arg0, Boolean oldPropertyValue, Boolean newPropertyValue)
            {
                if (newPropertyValue == false && !callPremium.getText().trim().isEmpty())
                {
                    SIMTradeCalculatorModel model = new SIMTradeCalculatorModel(numShares, purchasePrice, brokerage, callStrikePrice, putStrikePrice, putPremium, callPremium);
                    model.validateDecimal(callPremium, errorDisplay, performCalculationButton);
                    model.checkAllFields(performCalculationButton);
                }
                else {
                    callPremium.setText(callPremium.getText().trim());
                }
            }
        });

        putPremium.focusedProperty().addListener(new ChangeListener<Boolean>()
        {
            @Override
            public void changed(ObservableValue<? extends Boolean> arg0, Boolean oldPropertyValue, Boolean newPropertyValue)
            {
                if (newPropertyValue == false && !putPremium.getText().trim().isEmpty())
                {
                    SIMTradeCalculatorModel model = new SIMTradeCalculatorModel(numShares, purchasePrice, brokerage, callStrikePrice, putStrikePrice, putPremium, callPremium);
                    model.validateDecimal(putPremium, errorDisplay, performCalculationButton);
                    model.checkAllFields(performCalculationButton);
                }
                else {
                    putPremium.setText(putPremium.getText().trim());
                }
            }
        });
}

1 Ответ

0 голосов
/ 26 апреля 2018

Делайте то, что вы всегда делаете с повторяющимся кодом: определите метод, который инкапсулирует повторение, и параметризуйте изменяемый фрагмент:

private ChangeListener<Boolean> createListener(TextInputControl control) {

    return (obs, oldValue, newValue) -> {
        if ((! newValue) && ( !control.getText().trim().isEmpty() )) {
            SIMTradeCalculatorModel model = new SIMTradeCalculatorModel(numShares, purchasePrice, brokerage, callStrikePrice, putStrikePrice, putPremium, control);
                model.validateDecimal(control, errorDisplay, performCalculationButton);
                model.checkAllFields(performCalculationButton);
            } else {
                control.setText(control.getText().trim());
            }
        }
    };
}

Затем

callPremium.focusedProperty().addListener(createListener(callPremium));
putPremium.focusedProperty().addListener(createListener(putPremium));
...