Java 如何使用css更改滑块范围背景颜色?
我目前有一个滑块,我用CSS设计。我想要的是拇指滑动时改变颜色的范围。与此图片类似: 如何仅使用CSS来实现这一点?以下是我到目前为止所做的尝试Java 如何使用css更改滑块范围背景颜色?,java,css,javafx,Java,Css,Javafx,我目前有一个滑块,我用CSS设计。我想要的是拇指滑动时改变颜色的范围。与此图片类似: 如何仅使用CSS来实现这一点?以下是我到目前为止所做的尝试 .range-slider .range-bar { -fx-background-color: red; } 您可以通过对轨迹背景使用线性渐变,并将渐变更改的点绑定到滑块的值来完成此操作。其基本思想是,当滑块的值为50%时,背景应定义为 .slider.track{ -fx背景色:线性渐变(向右,红色0%,红色50%,-fx基本色50%,-fx基
.range-slider .range-bar {
-fx-background-color: red;
}
您可以通过对轨迹背景使用
线性渐变
,并将渐变更改的点绑定到滑块的值来完成此操作。其基本思想是,当滑块的值为50%时,背景应定义为
.slider.track{
-fx背景色:线性渐变(向右,红色0%,红色50%,-fx基本色50%,-fx基本色100%);
}
但是50%
应根据滑块的值进行更改
因此,在CSS文件中定义以下内容(我引入了一些额外的查找颜色,以便更容易修改样式):
滑块{
/*默认轨迹颜色:*/
-滑块填充轨迹颜色:红色;
-滑块轨迹颜色:-滑块填充的轨迹颜色;
}
/*使拇指的颜色与轨道的填充部分相同*/
.滑块.拇指{
-fx背景色:-滑块填充的轨迹颜色;
}
.滑块.轨迹{
-fx背景色:-滑块轨迹颜色;
}
然后你就可以做了
slider.styleProperty().bind(Bindings.createStringBinding(() -> {
double percentage = (slider.getValue() - slider.getMin()) / (slider.getMax() - slider.getMin()) * 100.0 ;
return String.format("-slider-track-color: linear-gradient(to right, -slider-filled-track-color 0%%, "
+ "-slider-filled-track-color %f%%, -fx-base %f%%, -fx-base 100%%);",
percentage, percentage);
}, slider.valueProperty(), slider.minProperty(), slider.maxProperty()));
将颜色更改的位置绑定到滑块的值
这里有一个SSCCE:
import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Slider;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class SliderStyleTest extends Application {
private static final String SLIDER_STYLE_FORMAT =
"-slider-track-color: linear-gradient(to right, -slider-filled-track-color 0%%, "
+ "-slider-filled-track-color %1$f%%, -fx-base %1$f%%, -fx-base 100%%);";
@Override
public void start(Stage primaryStage) {
Slider slider = new Slider();
slider.styleProperty().bind(Bindings.createStringBinding(() -> {
double percentage = (slider.getValue() - slider.getMin()) / (slider.getMax() - slider.getMin()) * 100.0 ;
return String.format(SLIDER_STYLE_FORMAT, percentage);
}, slider.valueProperty(), slider.minProperty(), slider.maxProperty()));
StackPane root = new StackPane(slider);
root.setPadding(new Insets(10));
Scene scene = new Scene(root);
scene.getStylesheets().add("style.css");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
其中style.css
就是上面的css文件。这使得:
您可以通过对轨迹背景使用
线性渐变,并将渐变变化的点绑定到滑块的值来完成此操作。其基本思想是,当滑块的值为50%时,背景应定义为
.slider.track{
-fx背景色:线性渐变(向右,红色0%,红色50%,-fx基本色50%,-fx基本色100%);
}
但是50%
应根据滑块的值进行更改
因此,在CSS文件中定义以下内容(我引入了一些额外的查找颜色,以便更容易修改样式):
滑块{
/*默认轨迹颜色:*/
-滑块填充轨迹颜色:红色;
-滑块轨迹颜色:-滑块填充的轨迹颜色;
}
/*使拇指的颜色与轨道的填充部分相同*/
.滑块.拇指{
-fx背景色:-滑块填充的轨迹颜色;
}
.滑块.轨迹{
-fx背景色:-滑块轨迹颜色;
}
然后你就可以做了
slider.styleProperty().bind(Bindings.createStringBinding(() -> {
double percentage = (slider.getValue() - slider.getMin()) / (slider.getMax() - slider.getMin()) * 100.0 ;
return String.format("-slider-track-color: linear-gradient(to right, -slider-filled-track-color 0%%, "
+ "-slider-filled-track-color %f%%, -fx-base %f%%, -fx-base 100%%);",
percentage, percentage);
}, slider.valueProperty(), slider.minProperty(), slider.maxProperty()));
将颜色更改的位置绑定到滑块的值
这里有一个SSCCE:
import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Slider;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class SliderStyleTest extends Application {
private static final String SLIDER_STYLE_FORMAT =
"-slider-track-color: linear-gradient(to right, -slider-filled-track-color 0%%, "
+ "-slider-filled-track-color %1$f%%, -fx-base %1$f%%, -fx-base 100%%);";
@Override
public void start(Stage primaryStage) {
Slider slider = new Slider();
slider.styleProperty().bind(Bindings.createStringBinding(() -> {
double percentage = (slider.getValue() - slider.getMin()) / (slider.getMax() - slider.getMin()) * 100.0 ;
return String.format(SLIDER_STYLE_FORMAT, percentage);
}, slider.valueProperty(), slider.minProperty(), slider.maxProperty()));
StackPane root = new StackPane(slider);
root.setPadding(new Insets(10));
Scene scene = new Scene(root);
scene.getStylesheets().add("style.css");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
其中style.css
就是上面的css文件。这使得:
不受支持-您需要实现自定义幻灯片皮肤。顺便说一句,想知道这些选择器是从哪里来的?不在..@kleopatra中,使用CSS和一些具有线性渐变的魔法实际上是可能的(几乎是可能的)…不受支持-您需要实现一个自定义的滑块皮肤。顺便说一句,想知道这些选择器是从哪里来的?不在..@kleopatra中使用CSS和一些线性渐变的魔法实际上是可能的(几乎是可能的)…您应该使用US语言环境格式化字符串,否则将使用默认的字符串,在某些用户的机器上,格式化双精度后,您将得到逗号而不是点,这是无效的CSS,并且将导致“CSS错误解析”。格式(Locale.US、SLIDER\u STYLE\u格式、百分比)。不过,最好的解决方案!您应该使用US语言环境设置字符串的格式,否则将使用默认值,并且在某些用户的计算机上,在格式化double后,您将获得逗号而不是点,这是无效的css,并且将导致“css错误解析”。格式(Locale.US、SLIDER\u STYLE\u格式、百分比)。不过,最好的解决方案!