【问题标题】:Can I use setStyle() to directly change a Node's substructure class style?我可以使用 setStyle() 直接更改节点的子结构类样式吗?
【发布时间】:2015-09-12 12:27:41
【问题描述】:

我有一个实现自定义 ProgressBar 的对象。有时我希望酒吧的轨道是白色的,有时我希望它是黑色的。我发现可以使用以下方法在我的 .css 文件中为其设置默认值:

.my-bar .track {
    -fx-background-color: bar-default-color;
}

我希望我可以根据传入的值设置在构造函数中改变颜色。但是尽管谷歌搜索它,我还没有找到一个例子,其中 Node.setStyle() 用于更改子结构类的样式。直接在 ProgressBar 对象上调用 setStyle("-fx-background-color: desired-color") 会创建与我想要的不匹配的奇怪颜色。我确定那是因为我需要将它设置在 .track 子结构而不是父类上。那么如何通过代码访问和更改呢?

【问题讨论】:

    标签: java javafx java-8


    【解决方案1】:

    您可以使用lookup( ) 从ProgressBar 中提取样式类为.track 的节点,然后对其应用样式:

    final Node track = progressBar.lookup(".track");
    track.setStyle("-fx-background-color: desired-color");
    

    【讨论】:

    • 这个答案的问题是我试图在应用程序显示之前(在 show() 之前)实例化对象时设置颜色。在调用 show 之前似乎没有创建子结构,所以我总是从查找中得到 null 。我在网上找到的另一个解决方案说使用 getChildrenUnmodifiable() 获取子类列表并查看它们遇到了同样的问题。它返回的节点列表在 show() 之前一直是空的。
    【解决方案2】:

    不能通过 setStyle() 直接更改 CSS 属性,但是(作为查找的替代)可以更改 CSS 属性中使用的颜色,这些颜色在 modena.css .root 中定义。

    因此,对于您的用例,进度条轨道定义为:

    .progress-bar > .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, -7%),
                derive(-fx-control-inner-background, 0%),
                derive(-fx-control-inner-background, -3%),
                derive(-fx-control-inner-background, -9%)
              );
        -fx-background-insets: 0, 0 0 1 0, 1 1 2 1;
        -fx-background-radius: 4, 3, 2; /* 10, 9, 8 */
    }
    

    这里的-fx-shadow-highlight-color、-fx-text-box-border 和-fx-control-inner-background 是预定义的颜色。它们可以通过 setStyle 来改变:

    progBar.setStyle( "-fx-control-inner-background: aqua; 
                       -fx-text-box-border: red; 
                       -fx-shadow-highlight-color:yellow"
                    );
    

    【讨论】:

    • 起初这不起作用,但在我从我的 css 文件中删除 -fx-background-color 行之后它开始了。也就是说,这不是一个完美的解决方案。我希望轨迹栏是单一的纯色(我对 3 个 css 属性中的每一个都使用相同的颜色)。但是使用你的方法,尤其是白色和其他较浅的颜色,会有轻微但明显的渐变效果。毫无疑问,这来自 modena.css 中的那些线性梯度派生线。当我在我的 css 中设置 -fx-background-color 时,它会覆盖它。但是通过您的方法,我们正在使用包含渐变的摩德纳规则。
    猜你喜欢
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    相关资源
    最近更新 更多