首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在javafx中改变滑块的填充颜色

如何在javafx中改变滑块的填充颜色
EN

Stack Overflow用户
提问于 2018-07-14 14:07:14
回答 2查看 8.5K关注 0票数 3

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

我能用css代码来做这个吗?如果是,这个的代码是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-14 18:24:13

长柱下方..。如果您想要一种简单的方法来实现滑块上的颜色,我应该提到,您可以使用 JFoenix滑翔机 ,它具有需要的功能。

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.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表示剩余的进度。现在开始和结束应该是数字,为了有你想要的外观,这两个数字必须相等,所以当一个停止,另一个开始。例如,如果您设置:

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.slider .track{
    -progress : 0.2;
    -fx-background-color: linear-gradient(to right, #2D819D -progress, #969696 -progress);
}

并在-progress上使用内联CSS规则更新ChangeListener。遗憾的是,由于某种原因,这一做法没有得到支持。我也想知道原因。另外,不能为子类应用内联CSS,这意味着不能执行slider.setStyle(".track {.}“);

总之,你可以:

1.使用查找访问滑块跟踪并直接应用CSS .

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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.从头开始定制滑雪板(不太难)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#color-slider .track{
    -fx-background-color:transparent;
}
票数 12
EN

Stack Overflow用户

发布于 2022-10-31 08:41:19

@JKostikiadis回答略有变化,避免了CSS查找。CSS查找可能存在问题,因为它们将返回null,除非应用CSS并进行布局传递。引用的答案通过在显示阶段后查找跟踪来避免这一点,但在某些情况下(特别是使用FXML,控制器初始化必须在用户界面添加到场景之前进行)。这个答案也会尽量保留默认样式。

这里的基本战略是:

  • 使用“查找颜色”来定义线性梯度,该梯度将从值的左边的轨道分隔到值的右侧。
  • 根据查找到的颜色设置轨道的背景色。
  • 使用滑块上的setStyle(...)以编程方式修改查找颜色。

这避免了CSS查找,因为查找颜色是在CSS中继承的。因此,仅在滑块本身上修改查找颜色就足够了:轨道(您不太容易引用)将继承该值。

值得查看应用于滑块及其跟踪的默认CSS,您可以在源代码中看到

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.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的第一个值定义了轨道下面的一个阴影1像素;第二个(由第一个线性梯度给出)定义了一个带有微妙梯度的1像素边界,第三个(第二个线性梯度)定义了轨道的大部分:它是一个基于标准主题颜色-fx-control-inner-background的细微线性梯度。

这里的计划是保留边框和阴影,并使用线性梯度改变中间的部分。由于不能使用线性梯度作为另一个线性梯度的目标,所以我们将使用-fx-control-inner-background近似轨道的默认中心。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.slider {
    -default-track-color: -fx-control-inner-background;
    -track-color: -default-track-color ;
}

然后使用相同的构造将阴影和边框环绕在轨道颜色周围。注意,我们只需使用默认样式表中定义的默认嵌入和填充:无需在这里重新定义它们:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.slider .track {
    -fx-background-color: -fx-shadow-highlight-color,
          linear-gradient(to bottom, derive(-fx-text-box-border, -10%), -fx-text-box-border),
          -track-color;
}

现在,在Java代码中,我们只需更新由滑块定义的-track-color

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    slider.valueProperty().addListener((obs, oldValue, newValue) -> {
        double percentage = 100.0 * newValue.doubleValue() / slider.getMax();
        String style = String.format(
                // in the String format, 
                // %1$.1f%% gives the first format argument ("1$"),
                // i.e. percentage, formatted to 1 decimal place (".1f").
                // Note literal % signs must be escaped ("%%")
                "-track-color: linear-gradient(to right, " +
                        "-fx-accent 0%%, " +
                        "-fx-accent %1$.1f%%, " +
                        "-default-track-color %1$.1f%%, " +
                        "-default-track-color 100%%);",
                percentage);
        slider.setStyle(style);
    });

下面是一个完整的例子:

style.css:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.slider {
    -default-track-color: -fx-control-inner-background;
    -track-color: -default-track-color ;
}

.slider .track {
    -fx-background-color: -fx-shadow-highlight-color,
          linear-gradient(to bottom, derive(-fx-text-box-border, -10%), -fx-text-box-border),
          -track-color;
}

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Slider;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

import java.io.IOException;

public class ProgressSlider extends Application {
    @Override
    public void start(Stage stage) throws IOException {
        Slider slider = new Slider();
        slider.valueProperty().addListener((obs, oldValue, newValue) -> {
            double percentage = 100.0 * newValue.doubleValue() / slider.getMax();
            String style = String.format(
                    "-track-color: linear-gradient(to right, " +
                            "-fx-accent 0%%, " +
                            "-fx-accent %1$.1f%%, " +
                            "-default-track-color %1$.1f%%, " +
                            "-default-track-color 100%%);",
                    percentage);
            slider.setStyle(style);
        });
        BorderPane root = new BorderPane(slider);
        Scene scene = new Scene(root, 400, 400);
        scene.getStylesheets().add(getClass().getResource("style.css").toExternalForm());
        stage.setScene(scene);
        stage.show();
    }

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51343759

复制
相关文章
力学概念|人工凿石的力学分析
金属没有广泛使用之前,古人是如何采石的呢?古人善用“借力打力”的方法,一种方法是将“木楔”放入孔洞,然后往木楔上浇水,木头遇水膨胀,这股巨大的张力可以将石头崩开。另一种方法是“火烧浇水”,即先用柴火把石头烧得灼热,然后泼几盆冷水上去,因为热胀冷缩,石头会崩裂疏松,更容易开凿。去过都江堰的都知道,李冰凿穿玉垒山采用的就是这个方法。
fem178
2023/08/23
2020
力学概念|人工凿石的力学分析
芯片开发语言:Verilog 在左,Chisel 在右
来源 | 老石谈芯 在最近召开的RISC-V中国峰会上,中科院计算所的包云岗研究员团队正式发布了名为“香山”的开源高性能处RISC-V处理器。前不久我有幸和包老师就这个事情做了一次深度的交流,我们聊了关于RISC-V、还有“香山”处理器的前世今生。包老师也分享了很多他关于开源硬件、新型开发语言、硬件敏捷设计、还有处理器基础架构等等这些问题的想法和学术思考,我深受启发。 包云岗是中科院计算技术研究所研究员、副所长,先进计算机系统研究中心主任,中国科学院大学特聘教授,中国开放指令生态(RISC-V)联盟秘书长
AI科技大本营
2023/05/08
1.8K0
芯片开发语言:Verilog 在左,Chisel 在右
AI还需要机器学习理论么?
最近,有几个朋友以不同的方式跟我表达了同一个意思:过去十年,机器学习理论没有给AI的发展带来任何帮助,它只是个理论圈自娱自乐的玩具。
算法进阶
2023/08/28
1630
AI还需要机器学习理论么?
IC数字前端开源仿真工具和LLHD
在数字电路前端设计流程中,前端仿真用于验证电路设计逻辑功能的正确性,常用的仿真软件有商业软件VCS和ModelSim(现在好像叫Questa了),国外大学里教学也常用一些开源软件,如iverilog和verilator。
hunterzju
2021/12/09
1.7K0
RDD — flatmap
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/139838.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/23
3440
Vue入坑第一式 | 博客全站 Vue.js 重构
dalao 们说的好啊,新年就是要入新坑。听说 Vue.js 是国人产物,又能降低代码量,缩短开发时间,何乐而不为?
Tony He
2022/11/17
6230
Vue入坑第一式 | 博客全站 Vue.js 重构
国人当自强 | 中国古代的“机器人梦”,带你看看祖先们的机械智慧
今天,机器人可以被设计、制作,为人类服务。而在中国,古代人早就有“机器人梦”,梦想着能制作一种形态像人的物件来代替人类劳动。为这个梦想,中国人制作出了能够自己活动的机械装置,可以被视为现代机器人的鼻祖。 春秋后期,鲁班曾经制造过一只能在空中自由飞行的木鸟,“三日不下”。三国时期的蜀汉,为了运送粮食,著名军事家诸葛亮发明了木制的带有晃动货箱的人力步行式运输器具——木牛流马,虽然其样貌不明,却被称为最早的陆地军用机器人。 虽然这都是些简易的装置,可是它们也都有着自己的动力来源。据史料记载,今天可知的我国古代机器
机器人网
2018/04/23
4.1K0
国人当自强 | 中国古代的“机器人梦”,带你看看祖先们的机械智慧
力学概念| 预应力应用实例
杭州黄龙体育中心建于2000年,如图1所示。体育场直径为244 m悬挑屋盖的跨度为 50 m,为观众提供了一个无障碍的视线空间。屋盖采用双层网格结构,支承在内外环梁上。内环梁通过斜拉索悬挂在体育场两端的塔柱上。斜拉索为屋盖提供了弹性支承,降低了屋盖的内力(弯矩),屋盖的刚度随之增大。塔柱承受了斜拉索传来的巨大拉力,包括悬挑屋盖的自重和屋盖上的荷载。这些索拉力在85m高的塔上产生了巨大的弯矩,给塔柱设计带来了挑战。弯矩大,配筋过多,造成施工困难,表面也容易产生裂缝,影响混凝土耐久性。为了减小塔中的弯矩在塔柱的后部施加后张预应力以抵消索产生的弯矩作用。通过这种方式,塔柱中的弯矩变小,从而节省了材料,也增大了结构刚度。图2给出了一个塔柱的弯矩。图2a定性地给出了塔的高度、作用在塔柱上的力以及塔柱中的弯矩。最大弯矩发生在塔柱的底部,记为
fem178
2023/10/25
2580
力学概念| 预应力应用实例
[AI] John Deere发表农用AI无人牵引机
老牌农业机械制造商John Deere,在CES 2022上,发表了最新可大规模生产的无人牵引机(Tractor),该牵引机支持TruSet凿犁、GPS导引系统等先进系统,官方尚未公布价格,但提到,无人牵引机会在今年稍晚正式上市。
阿泽
2022/01/20
3330
[AI] John Deere发表农用AI无人牵引机
《人民日报》两度点赞极氪智慧工厂 广域铭岛持续智造赋能
近日,《人民日报》关注了极氪智慧工厂,介绍了其智能制造系统在品质管控和个性化定制方面的表现。这也是今年以来,《人民日报》第二次关注极氪智慧工厂。
中国新闻网
2023/05/08
1650
广域铭岛出席AEE2023汽车技术年会 分享自研工业APP应用成效及价值
2月23日,广域铭岛参加AEE2023年汽车技术年会,分享了自研工业APP在汽车整车工艺质量提升中的应用案例及成效,重点阐述了在焊点质量管理、尺寸管理、冲压排产、冲压模具管理、拧紧管理等汽车工艺场景中,工业APP给汽车制造企业带来的业务价值。
中国新闻网
2023/02/28
2900
我的世界服务器必备指令手机版_我的世界服务器传送点指令
箭非常的酷。大约五分钟,这项技能会不断增加它的伤害随着级别的升高,最后你能射晕对手,对PVP有好处。还有,箭术等级越高,你就越容易从尸体上拿回箭。
全栈程序员站长
2022/09/28
4.7K0
MarkDown 语法
标题 一级标题 二级标题 三级标题 四级标题 五级标题 六级标题 ## 标题 # 一级标题 ## 二级标题 ### 三级标题 #### 四级标题 ##### 五级标题 ###### 六级标题 列表 1. 无序列表 无序列表(01) 继续分列表(001) 继续分列表(002) 继续分列表(003) 无序列表(02) 继续分列表(001) 继续分列表(0001) 继续分列表(0002) 继续分列表(0003) 继续分列表(002) 继续分列表(003) 2. 有序列表 有序列表(01)
用户1890628
2018/05/10
1.4K0
面试题精选:Android埋点,减少对业务代码的入侵
前几天去参加了一场面试。面试的题目大多很基础,有一道关于埋点的问题,面试官问我如果不用第三方SDK进行埋点,自己埋点的话,如何减少埋点对业务代码的入侵。
Android技术干货分享
2019/10/15
9300
面试题精选:Android埋点,减少对业务代码的入侵
分布式系统-----BASE理论
CAP理论是分布式系统的基石, 那么base理论就是分布式系统的台阶了,在基石上凿的台阶。
袁新栋-jeff.yuan
2022/05/05
3940
中国台湾“缺水危机”再现,恐将冲击晶圆代工及面板制造业
2月22日消息,据中国台湾媒体报道,台湾南部正面临30年最大枯旱,台湾自来水股份有限公司昨(21)日宣布,3月1日起台南地区的水情预警灯号调整为减量供水的“橙灯”,台南市工业区、科学园区将实施节水10%,非科学园区及工业区的每月用水量1,000度以上工业用户,同样须节水一成。这也使得晶圆代工、显示面板制造等高耗水产业拉响警报。
芯智讯
2023/03/25
2370
中国台湾“缺水危机”再现,恐将冲击晶圆代工及面板制造业
xshell隧道转发的三种类型
利用XShell隧道通过跳板机连接内网机器。跳板机公网可以访问,或者通过局域网可以访问,但内网的节点公网或局域网无法直接访问。
后端云
2019/08/29
10.2K0
xshell隧道转发的三种类型
别让接线这件小事,拉开你与工程师的差距
导线与导线的连接、线头与接线桩的连接,事情小,责任大。本文图文并茂,让你清清楚楚看懂! 导线与导线的连接 导线的连接情况有:单股铜芯导线的直线连接、T字形连接;双股线的对接;多股铜芯导线的直线连接、T
机器人网
2018/05/04
8800
别让接线这件小事,拉开你与工程师的差距
玩转 Spring Boot 应用篇(引入RabbitMQ解决店铺下单峰值问题)(十八)
上次分享通过集成 Redis 技术组件,让请求不再直接查询数据库,而是优先从 Redis 查询商品信息,进而来解决数据库高并发读的问题。
botkenni
2022/09/23
2810
玩转 Spring Boot 应用篇(引入RabbitMQ解决店铺下单峰值问题)(十八)
看不见的城市 III:智慧之城为人服务才是智慧城市的内核
在智慧城市的建设中,城市本身的复杂性不应被看作科技发展的阻碍,而是帮助科技回归人性化,回归到为人服务的初心,才是智慧城市的内核。 【编者按】城市是什么?主政者、规划者,建设者,居住者,迁徙的异乡者,游览的观光客……相信答案五花八门。无论答案是什么,有一点可以肯定,城市是承载许多人生活与梦想的所在。这里面,有快乐,有希冀,有追求,有梦想,有苦痛,有委屈,有遗憾,也许你在城市生活多年,可是你真的认识你的城市吗?或者说,你看见了城市的一部分,而城市更多的面孔是你所未曾看见的。 就像意大利作家卡尔维诺在《看不见的城
企鹅号小编
2018/01/12
7640
看不见的城市 III:智慧之城为人服务才是智慧城市的内核

相似问题

使用iptables阻止所有传入的IP

10

阻止到特定IP地址的Web流量

10

iptables阻止我连接

10

如何阻止来自端口上IP地址的传入通信量

10

IPTables/UFW不允许传入连接

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文