Windows 区域设置如何影响 javafx 应用程序
How Windows regional settings affect javafx application
我正在开发 javafx 应用程序,我注意到,当 Windows 区域设置已更改时,某些 CSSstyle/double 功能无法正常工作(我来自爱沙尼亚)。
当我打开程序 window 时,某些字段被禁用(组合框和日期选择器):
禁用代码:
public void lockElements() {
policyTypeCombo.setDisable(true);
insurerCombo.setDisable(true);
clientCombo.setDisable(true);
startDate.setDisable(true);
}
单击“解锁”按钮后,此代码有效:
@FXML
public void unlockElements() {
policyTypeCombo.setDisable(false);
insurerCombo.setDisable(false);
startDate.setDisable(false);
}
一切都非常简单,在我的 IntellijIdea 中一切正常:
此外,当我在 Sum 文本字段中输入一些 Double 时,它应该自动填充第 1-12 部分的总和:
这是代码,只允许输入双精度:
sumText.textProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
if (!newValue.matches("\d{0,7}([\.]\d{0,4})?")) {
sumText.setText(oldValue);
}
}
});
这是代码的一部分,用于填充其他总和
double sum = Double.valueOf(sumText.getText());
double part = sum / 12d;
part1Sum.setText(String.format("%.2f", part));
part2Sum.setText(String.format("%.2f", part));
part3Sum.setText(String.format("%.2f", part));
part4Sum.setText(String.format("%.2f", part));
part5Sum.setText(String.format("%.2f", part));
part6Sum.setText(String.format("%.2f", part));
part7Sum.setText(String.format("%.2f", part));
part8Sum.setText(String.format("%.2f", part));
part9Sum.setText(String.format("%.2f", part));
part10Sum.setText(String.format("%.2f", part));
part11Sum.setText(String.format("%.2f", part));
part12Sum.setText(String.format("%.2f", part));
打包我的应用程序并在我的计算机上安装后,一切正常。
但是在具有不同区域设置的计算机上我有这张图片:单击解锁按钮后,组合框和日期选择器仍然 "light-gray"(但工作,我可以选择其他选项):
当我输入新的总和时,1-12 部分总和不会自动填充。
据我所知,它以某种方式与Reginal decimal symbols或类似的东西有关。
问题:如何让我的应用程序独立于机器区域设置?
谢谢大家,谢谢@Slaw。我使用 BigDecimal 解决了这个问题。
代码是:
double sum = Double.valueOf(sumText.getText());
double part = sum / 12d;
part1Sum.setText(String.format("%.2f", part));
part2Sum.setText(String.format("%.2f", part));
part3Sum.setText(String.format("%.2f", part));
part4Sum.setText(String.format("%.2f", part));
part5Sum.setText(String.format("%.2f", part));
part6Sum.setText(String.format("%.2f", part));
part7Sum.setText(String.format("%.2f", part));
part8Sum.setText(String.format("%.2f", part));
part9Sum.setText(String.format("%.2f", part));
part10Sum.setText(String.format("%.2f", part));
part11Sum.setText(String.format("%.2f", part));
part12Sum.setText(String.format("%.2f", part));
我改成了:
int scale = 2;
double sum = BigDecimal.valueOf(Double.valueOf(sumText.getText()) / 12d).setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
part1Sum.setText(Double.toString(sum));
part2Sum.setText(Double.toString(sum));
part3Sum.setText(Double.toString(sum));
part4Sum.setText(Double.toString(sum));
part5Sum.setText(Double.toString(sum));
part6Sum.setText(Double.toString(sum));
part7Sum.setText(Double.toString(sum));
part8Sum.setText(Double.toString(sum));
part9Sum.setText(Double.toString(sum));
part10Sum.setText(Double.toString(sum));
part11Sum.setText(Double.toString(sum));
part12Sum.setText(Double.toString(sum));
现在一切正常。
我正在开发 javafx 应用程序,我注意到,当 Windows 区域设置已更改时,某些 CSSstyle/double 功能无法正常工作(我来自爱沙尼亚)。
当我打开程序 window 时,某些字段被禁用(组合框和日期选择器):
public void lockElements() {
policyTypeCombo.setDisable(true);
insurerCombo.setDisable(true);
clientCombo.setDisable(true);
startDate.setDisable(true);
}
单击“解锁”按钮后,此代码有效:
@FXML
public void unlockElements() {
policyTypeCombo.setDisable(false);
insurerCombo.setDisable(false);
startDate.setDisable(false);
}
一切都非常简单,在我的 IntellijIdea 中一切正常:
sumText.textProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
if (!newValue.matches("\d{0,7}([\.]\d{0,4})?")) {
sumText.setText(oldValue);
}
}
});
这是代码的一部分,用于填充其他总和
double sum = Double.valueOf(sumText.getText());
double part = sum / 12d;
part1Sum.setText(String.format("%.2f", part));
part2Sum.setText(String.format("%.2f", part));
part3Sum.setText(String.format("%.2f", part));
part4Sum.setText(String.format("%.2f", part));
part5Sum.setText(String.format("%.2f", part));
part6Sum.setText(String.format("%.2f", part));
part7Sum.setText(String.format("%.2f", part));
part8Sum.setText(String.format("%.2f", part));
part9Sum.setText(String.format("%.2f", part));
part10Sum.setText(String.format("%.2f", part));
part11Sum.setText(String.format("%.2f", part));
part12Sum.setText(String.format("%.2f", part));
打包我的应用程序并在我的计算机上安装后,一切正常。
但是在具有不同区域设置的计算机上我有这张图片:单击解锁按钮后,组合框和日期选择器仍然 "light-gray"(但工作,我可以选择其他选项):
谢谢大家,谢谢@Slaw。我使用 BigDecimal 解决了这个问题。 代码是:
double sum = Double.valueOf(sumText.getText());
double part = sum / 12d;
part1Sum.setText(String.format("%.2f", part));
part2Sum.setText(String.format("%.2f", part));
part3Sum.setText(String.format("%.2f", part));
part4Sum.setText(String.format("%.2f", part));
part5Sum.setText(String.format("%.2f", part));
part6Sum.setText(String.format("%.2f", part));
part7Sum.setText(String.format("%.2f", part));
part8Sum.setText(String.format("%.2f", part));
part9Sum.setText(String.format("%.2f", part));
part10Sum.setText(String.format("%.2f", part));
part11Sum.setText(String.format("%.2f", part));
part12Sum.setText(String.format("%.2f", part));
我改成了:
int scale = 2;
double sum = BigDecimal.valueOf(Double.valueOf(sumText.getText()) / 12d).setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
part1Sum.setText(Double.toString(sum));
part2Sum.setText(Double.toString(sum));
part3Sum.setText(Double.toString(sum));
part4Sum.setText(Double.toString(sum));
part5Sum.setText(Double.toString(sum));
part6Sum.setText(Double.toString(sum));
part7Sum.setText(Double.toString(sum));
part8Sum.setText(Double.toString(sum));
part9Sum.setText(Double.toString(sum));
part10Sum.setText(Double.toString(sum));
part11Sum.setText(Double.toString(sum));
part12Sum.setText(Double.toString(sum));
现在一切正常。