根据滑块的值 JavaFX 更改进度条颜色

Change progressbar colour based on slider's value JavaFX

我已经求助于此previous answer,但我仍然遇到问题

我想随着滑块值的变化更改进度条的颜色,但我的进度条始终保持红色并且 不会改变 如果它超过 2、4、6 .我在这里错过了什么? (值:最小值为 0,最大值为 10)

slider是滑块的id,pbar是进度条的id。

一段代码:

private static final String RED_BAR    = "red-bar";
private static final String YELLOW_BAR = "yellow-bar";
private static final String ORANGE_BAR = "orange-bar";
private static final String GREEN_BAR  = "green-bar";
private static final String[] barColorStyleClasses = { RED_BAR, ORANGE_BAR, YELLOW_BAR, GREEN_BAR };
public void initialize(URL location, ResourceBundle resources) {
   slider.valueProperty().addListener(new ChangeListener<Number>() {
        public void changed(ObservableValue<? extends Number> ov, Number old_val, Number new_val) {
            pbar.setProgress(new_val.doubleValue()/10);
        }
    });

    pbar.progressProperty().addListener(new ChangeListener<Number>() {
        @Override public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
            double progress = newValue == null ? 0 : newValue.doubleValue();
            if (progress < 2) {
                setBarStyleClass(pbar, RED_BAR);
            } else if (progress < 4) {
                setBarStyleClass(pbar, ORANGE_BAR);
            } else if (progress < 6) {
                setBarStyleClass(pbar, YELLOW_BAR);
            } else {
                setBarStyleClass(pbar, GREEN_BAR);
            }
        }
        private void setBarStyleClass(ProgressBar bar, String barStyleClass) {
            bar.getStyleClass().removeAll(barColorStyleClasses);
            bar.getStyleClass().add(barStyleClass);
        }
    });
}

CSS 文件:

.root { -fx-background-color: cornsilk; -fx-padding: 15; }
.pbar { -fx-box-border: goldenrod; }
.green-bar  { -fx-accent: green;  }
.yellow-bar { -fx-accent: yellow; }
.orange-bar { -fx-accent: orange; }
.red-bar    { -fx-accent: red;    }

进度条的进度介于 0 和 1 之间,因此第一个 if 子句中的条件将始终为真。 (slider 的 值范围在 0 到 10 之间,但是你将进度条的进度设置为该值除以 10,改变样式的监听器响应的是该值,而不是 slider 的值.)

您可能需要针对 0.20.4 等进行测试,或者使用滑块的值而不是进度条的进度注册第二个侦听器。