Java 如何使用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基

我目前有一个滑块,我用CSS设计。我想要的是拇指滑动时改变颜色的范围。与此图片类似:

如何仅使用CSS来实现这一点?以下是我到目前为止所做的尝试

.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格式、百分比)。不过,最好的解决方案!