如何根据滑块上拇指的当前位置处的滑块颜色更改jfxslider拇指的颜色?

hfsqlsce  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(391)

我用的是 JFXSlider 在javafx中,我使用了线性渐变作为 JFXSlider 的曲目(使用css)。不过,我还想将拇指的颜色更改为该位置的滑块的颜色。我使用了下面的css作为滑块的线性渐变,并去掉了 JFXSlider :

.jfx-slider .track {
    -fx-pref-height: 10;
    -fx-background-color: linear-gradient(to right,red,orange);
}
.jfx-slider .colored-track {
    -fx-background-color: transparent;
}

我尝试了下面的css代码以使拇指的颜色与当前位置的滑块的颜色相同,但是没有成功。

.jfx-slider .thumb {
    -fx-background-color: linear-gradient(to right,red,orange);
}

我想这可能是因为我尝试的代码只为拇指的背景色提供了一个内部线性渐变。有人知道怎么解决这个问题吗?p、 我使用的是jfoenix 9.0.10、javafx 15和jdk 15。

esyap4oy

esyap4oy1#

一种可能的解决方案是添加一个全局css变量,并根据jfxslaider的当前值对其进行更改。例如:

.root {
    -fx-custom-color : red;
}

然后在jfx滑块css规则上使用此变量,如:

/* Styling the slider thumb */
.jfx-slider>.thumb {
    -fx-background-color: -fx-custom-color;
}

/* Styling the animated thumb */
.jfx-slider>.animated-thumb {
    -fx-background-color: -fx-custom-color;
}

之后,您需要弄清楚如何更新“-fx custom color”变量,以及如何确定需要为滑块的特定值(或者更确切地说是位置)设置哪种颜色。
首先,应该向value属性添加一个侦听器,以侦听值更改。其次,利用颜色类的插值方法来确定颜色,最后更新新的颜色值 -fx-custom-color 在jfxslaider中使用内联css样式。
下面是一个完整的示例:

import com.jfoenix.controls.JFXSlider;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class SliderTesting extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {

        JFXSlider slider = new JFXSlider(0, 100, 0);

        slider.valueProperty().addListener(e -> {
            Color imageColor = Color.RED.interpolate(Color.ORANGE,
                    slider.getValue() / 100);
            slider.setStyle("-fx-custom-color : " + colorToHex(imageColor) + ";");
        });

        VBox box = new VBox(slider);
        box.setPadding(new Insets(20));
        box.setPrefSize(400, 400);
        box.setAlignment(Pos.CENTER);

        Scene scene = new Scene(box);
        scene.getStylesheets()
                .add(this.getClass().getResource("custom-jfoenix.css").toExternalForm());
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static String colorToHex(Color color) {
        return String.format("#%02X%02X%02X", (int) (color.getRed() * 255),
                (int) (color.getGreen() * 255), (int) (color.getBlue() * 255));
    }
}

以及“custom jfoenix.css”文件

.root {
    -fx-custom-color : red;
}

/* Styling the slider track */
.jfx-slider>.track {
    -fx-pref-height: 10;
}

/* Styling the slider thumb */
.jfx-slider>.thumb {
    -fx-background-color: -fx-custom-color;
}

/* Styling the filled track */
.jfx-slider>.colored-track {
    -fx-background-color: linear-gradient(to right, red, orange);
}

/* Styling the animated thumb */
.jfx-slider>.animated-thumb {
    -fx-background-color: -fx-custom-color;
}

结果是:

相关问题