【问题标题】:How can i apply more than 1 style to a single node at the same time programmatically如何以编程方式同时将一种以上的样式应用于单个节点
【发布时间】:2016-12-14 12:50:50
【问题描述】:

我正在用 JavaFX 创建一个计算器。我有一个带有 fx:ID #labelResult 的标签,采用 css 样式。现在我将键盘监听器添加到主窗格。因此,当我按下 Left/Right 箭头键时,我会将 #labelResult 的背景颜色更改为字符串 bgColors 数组中的颜色。我还添加了一个功能,可以在按下 上/下 箭头键时更改标签字体大小。现在的问题是。看来我不能同时应用这两种效果。因此,当我更改标签的背景颜色并触发更改字体大小机制时,字体大小效果将应用于标签,而 bg 颜色效果会重置。我怎样才能同时应用这两种效果?

P.S : 我使用 setStyle 方法在我的控制器中的两种情况下应用样式。

 CSS (before applying styles in my controller)

#labelRESULT {  
-fx-background-color: rgba(59, 74, 107, 0.8);
-fx-font-size: 45px;
-fx-text-fill: #fff;
}

Controller.java

@FXML
private Label labelRESULT;

@FXML
private void handleKeys(KeyEvent event) {
    int size = 45;
    String keyPressed = event.getCode().toString().toUpperCase();
    switch (keyPressed) {
        case "RIGHT":
            labelRESULT.setStyle("-fx-bg-color: #" + bgColors[1]);
            break;
        case "UP":
            labelRESULT.setStyle("-fx-font-size: " + (size + 2) + "px;");
            break;
    }
}

所发生情况的图片:http://imgh.us/javafx-calc.png

1- 在以编程方式应用样式之前

2-改变标签的bg颜色后

3-在更改bg颜色的同时更改标签的字体大小后

【问题讨论】:

  • 当您设置样式时,您会覆盖所有以前的样式。更好的解决方案是制作单独的css文件并在类之间切换。
  • @fabian 谢谢,添加了休息时间。

标签: java css javafx javafx-2 javafx-8


【解决方案1】:

如果您将 getStyle() 的结果(即 bgColor)与其他样式(即 fontSize)连接起来,然后再次使用 setStyle(),也许会有所帮助?

EDIT 这将是另一个选项(在正确的位置将标志设置为 true 或 false):

labelRESULT.pseudoClassStateChanged(PseudoClass.getPseudoClass("left-right-pressed"), flag);


labelRESULT.pseudoClassStateChanged(PseudoClass.getPseudoClass("up-down-pressed"), flag);

并在您的 css 中定义一个自定义伪类:

:left-right-pressed {
    -fx-background-color: yellow;
}

:up-down-pressed {
    -fx-font-size: 14;
}

【讨论】:

  • 太棒了!!连接工作得很好!不知道为什么我没有想到这一点。再次感谢=D
  • 只有一个问题。现在我遇到了另一个问题。每次我更改背景颜色或文本大小时,(getStyle)字符串都会变得越来越大。是否可以替换相同类型的效果。就像我想用另一个替换背景效果而不是每次都将新效果附加到样式表一样。 imgh.us/2016-12-14_15h31_07.png
  • @RafatRefai 只是将状态保存在某处并根据状态替换 style。根据州号,应该只包括一个或两个部分......
  • 也许您可以跟踪您设置的样式(将它们存储在某处),然后在再次使用 setStyle() 之前,使用 String.replace() 方法删除旧的未使用样式。或者试试编辑部分的解决方案,反正更优雅。
【解决方案2】:

您可以将 css 类添加/切换到您的节点。

JavaFXUtils.addClasses(node, "my-class-for-font");
JavaFXUtils.removeClasses(node, "my-class-for-color");

【讨论】:

  • 我该怎么做。请问可以提供代码吗?我更新了我的问题以包含我的控制器的一部分,你能看一下吗?
  • 谢谢。另一个答案解决了我的问题。但我也会尝试你的方法,看看它是否有效
猜你喜欢
  • 2019-02-23
  • 2015-02-09
  • 1970-01-01
  • 2022-11-10
  • 2012-12-04
  • 1970-01-01
  • 1970-01-01
  • 2021-10-12
  • 1970-01-01
相关资源
最近更新 更多