Windows区域设置如何影响javafx应用程序

时间:2019-02-22 14:56:02

标签: java javafx regional-settings

我正在使用javafx应用程序,并且我注意到,当Windows区域设置已更改时(我来自爱沙尼亚),某些CSSstyle / double函数无法正常工作。 当我打开程序窗口时,某些字段被禁用(组合框和日期选择器): enter image description here 禁用代码:

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中,一切正常: enter image description here 另外,当我在“求和”中输入一些Double文本字段时,它应该自动填充part1-12的总和: enter image description here 这是代码,只允许输入double:

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

打包我的应用程序并安装到计算机上后,一切正常。 但是在具有不同区域设置的计算机上,我有此图片:单击“解锁”按钮后,组合框和日期选择器仍为“浅灰色”(但可以使用,我可以选择其他选项): enter image description here 当我输入新的总和时,不会自动填写1-12个部分的总和。 据我了解,它以某种方式与Reginal十进制符号或类似的东西相关。 问题:如何使我的应用程序独立于机器区域设置?

1 个答案:

答案 0 :(得分:0)

谢谢大家,谢谢@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));

现在一切正常。