【问题标题】:how to change fill color of slider in javafx如何在javafx中更改滑块的填充颜色
【发布时间】:2018-07-14 22:07:14
【问题描述】:

我正在制作一个视频播放器,想使用一个滑块作为时间线,我想将滑块从第一张图片更改为第二张

我可以只使用 css 代码来做到这一点吗?如果是的话,这个代码是什么

【问题讨论】:

    标签: java javafx


    【解决方案1】:

    下面的长帖.. 如果您想要一种简单的方法来实现滑块上的​​颜色,我应该提一下,您可以使用具有您需要的功能的 JFoenix Slider

    虽然如果您可以在本地获得相同的结果,实际上不需要使用第三个库。

    嗯,没有任何 CSS 规则,如 -fx-progress-color,您将其设置为特定颜色,然后您就完成了。 .track 的颜色使用下面的 CSS 规则设置:

    .slider .track {
          -fx-background-color:
              -fx-shadow-highlight-color,
              linear-gradient(to bottom, derive(-fx-text-box-border, -10%), -fx-text-box-border),
              linear-gradient(to bottom,
                derive(-fx-control-inner-background, -9%),
                derive(-fx-control-inner-background, 0%),
                derive(-fx-control-inner-background, -5%),
                derive(-fx-control-inner-background, -12%)
              );
        -fx-background-insets: 0 0 -1 0, 0, 1;
        -fx-background-radius: 0.25em, 0.25em, 0.166667em; /* 3 3 2 */
        -fx-padding: 0.25em; /* 3 */
    }
    

    您需要做的事情很少,第一个是监听滑块的值变化,第二个是根据滑块的值更新轨道颜色。要设置背景颜色,您需要为背景设置一个线性渐变,例如:

    -fx-background-color: linear-gradient(to right, #2D819D START, #969696 END);

    使用上面的代码,您将使用颜色#2D819D(表示“进度”颜色)和#969696(表示剩余进度)从左到右设置线性渐变背景。现在 START 和 END 应该是数字,为了获得您想要的外观,两个数字必须相等,因此当一个停止时另一个开始。例如,如果您设置:

    -fx-background-color: linear-gradient(to right, #2D819D 20%, #969696 20%);

    真正的挑战是找到一种在滑块的 ChangeListener 中以编程方式设置这些值的方法。我的第一种方法是使用 CSS 变量,例如:

    .slider .track{
        -progress : 0.2;
        -fx-background-color: linear-gradient(to right, #2D819D -progress, #969696 -progress);
    }
    

    并使用 ChangeListener 上的内联 CSS 规则更新 -progress。遗憾的是,由于某种原因,这不受支持。我也很想知道为什么。此外,你不能为子类应用内联 CSS,这意味着你不能做 slider.setStyle(".track {...}");

    总而言之,您可以:

    1.使用查找访问滑块的轨道并直接应用 CSS。

    import javafx.application.Application;
    import javafx.beans.value.ChangeListener;
    import javafx.beans.value.ObservableValue;
    import javafx.geometry.Insets;
    import javafx.scene.Scene;
    import javafx.scene.control.Slider;
    import javafx.scene.layout.BorderPane;
    import javafx.scene.layout.StackPane;
    import javafx.stage.Stage;
    
    public class CustomSlider extends Application {
    
        @Override
        public void start(Stage stage) throws Exception {
            BorderPane mainPane = new BorderPane();
            mainPane.setPadding(new Insets(15));
    
            Slider slider = new Slider();
            slider.setId("color-slider");
    
            mainPane.setCenter(slider);
    
            Scene scene = new Scene(mainPane, 250, 400);
            stage.setScene(scene);
            stage.show();
    
            StackPane trackPane = (StackPane) slider.lookup(".track");
    
            slider.valueProperty().addListener(new ChangeListener<Number>() {
                public void changed(ObservableValue<? extends Number> ov, Number old_val, Number new_val) {
                    String style = String.format("-fx-background-color: linear-gradient(to right, #2D819D %d%%, #969696 %d%%);",
                            new_val.intValue(), new_val.intValue());
                    trackPane.setStyle(style);
                }
            });
    
            trackPane.setStyle("-fx-background-color: linear-gradient(to right, #2D819D 0%, #969696 0%);");
    
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    }
    

    2。从头开始制作自定义 Slider(没那么难)

    import javafx.application.Application;
    import javafx.beans.value.ChangeListener;
    import javafx.beans.value.ObservableValue;
    import javafx.geometry.Insets;
    import javafx.scene.Scene;
    import javafx.scene.control.Slider;
    import javafx.scene.layout.BorderPane;
    import javafx.scene.layout.StackPane;
    import javafx.scene.paint.Color;
    import javafx.scene.shape.Rectangle;
    import javafx.stage.Stage;
    
    public class SliderTest extends Application {
    
        @Override
        public void start(Stage primaryStage) {
            BorderPane mainPane = new BorderPane();
            mainPane.setPadding(new Insets(15));
    
            mainPane.setCenter(new ColorSlider());
    
            Scene scene = new Scene(mainPane, 250, 400);
            primaryStage.setScene(scene);
            primaryStage.show();
    
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    
        public class ColorSlider extends StackPane {
    
            public ColorSlider() {
                getStylesheets().add(this.getClass().getResource("colorSlider.css").toExternalForm());
                Slider slider = new Slider();
                slider.setId("color-slider");
    
                // The rectangle which shows the progress
                Rectangle progressRec = new Rectangle();
                // Bind both width and height to match the size of Slider
                progressRec.heightProperty().bind(slider.heightProperty().subtract(7));
                progressRec.widthProperty().bind(slider.widthProperty());
    
                progressRec.setFill(Color.web("#969696"));
    
                // Make the corners of Rectangle to be rounded
                progressRec.setArcHeight(15);
                progressRec.setArcWidth(15);
    
                // Listen on value changes on the slider to update the progress (color)
                slider.valueProperty().addListener(new ChangeListener<Number>() {
                    public void changed(ObservableValue<? extends Number> ov, Number old_val, Number new_val) {
                        // Using linear gradient we can fill two colors to show the progress
                        // the new_val gets values between 0 - 100
                        String style = String.format("-fx-fill: linear-gradient(to right, #2D819D %d%%, #969696 %d%%);",
                                new_val.intValue(), new_val.intValue());
                        // set the Style
                        progressRec.setStyle(style);
                    }
                });
    
                getChildren().addAll(progressRec, slider);
            }
        }
    }
    

    colorSlider.css

    #color-slider .track{
        -fx-background-color:transparent;
    }
    

    【讨论】:

    • 我正在使用JFXSlider,我正在尝试访问轨道节点,但第一个解决方案(带有.lookup() 的解决方案)不起作用。
    • @TheTechExpertGuy 请问你为什么要访问JFXSlider的track节点?我也许可以帮助你或给你一个建议。
    • 我想为JFXSlider 的轨道节点设置一个从红色到橙色(或者其他颜色;我仍在寻找我需要的确切颜色)的线性渐变。谢谢!
    • 我已经能够部分解决问题using CSS。但是,我仍然必须摆脱JFXSlider 自己的绿色。我认为使用transparent 的颜色会起作用,但我不知道在哪里可以更改它自己的颜色。谢谢!
    • @TheTechExpertGuy 很容易实现它(刚刚做了)你可以在这里找到所有的 CSS 规则github.com/jfoenixadmin/JFoenix/wiki/Slider。如果您不知道如何使用链接中的 css 规则,我可以为您提供一个小示例,如果您创建一个新帖子,请告诉我,我将在那里发布一个完整示例。
    猜你喜欢
    • 2014-07-25
    • 2018-08-12
    • 2013-10-08
    • 2017-12-19
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 2020-07-22
    相关资源
    最近更新 更多