java - JavaFXfocusedProperty().addListener 重构代码
问题描述
我在表单上有文本字段,当字段不在焦点上时我执行操作。我为每个字段都有一个单独的侦听器代码,并且想知道如何合并此代码,以便所有字段都有一个侦听器代码,因为我有重复的代码,唯一不同的是文本字段名称。
@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());
}
}
});
}
解决方案
对重复的代码做你经常做的事情:定义一个封装重复的方法并对变化的部分进行参数化:
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));
推荐阅读
- aem - AEM MAVEN JAVA 8 - maven-jspc-plugin::maven-jspc-plugin 编译 jsp 结果总是出错(目标 1.5)
- python - "df['Good Quality'] = [1 if x>=7 else 0 for x in df['quality']]" 和下面给出的扩展线有什么区别?
- playframework - sbt -jvm-debug 端口在 Windows 10 上被忽略
- python - 403 Forbidden request with PHP Post request在Python中工作
- reactjs - React Searchbar历史推送到另一个页面但带有一个组件
- apache-kafka - Dataproc 中的 Presto:配置 Kafka 目录
- python - 使用 mypy 在 TypeGuard 函数中使用泛型类型
- r - 访问 Twitter 流 API - 身份验证在 R 中不起作用
- r - 将行中的字符序列转换为R中的单独行
- c# - 将 HTTP 更改为 HTTPS 在 Asp.net 网页中出现“重定向过多”错误