根据滑块的值 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.2
、0.4
等进行测试,或者使用滑块的值而不是进度条的进度注册第二个侦听器。
我已经求助于此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.2
、0.4
等进行测试,或者使用滑块的值而不是进度条的进度注册第二个侦听器。