通过JavaFX 8中的代码访问和更改css伪类的值

时间:2016-10-15 21:22:27

标签: java css javafx javafx-8

是否可以访问css伪类,例如.text-area *.text {},更重要的是通过代码更改它们的值? 在这种情况下textArea.setStyle()似乎不适用。 描述问题: 我试图在按钮点击时更改TextArea的文本对齐方式。 我知道可以通过

更改对齐方式
.text-area *.text {
-fx-text-alignment: center;
}

但如何将其绑定到按钮点击?

1 个答案:

答案 0 :(得分:2)

请注意,CSS选择器.text-area *.text

中没有使用伪类

使用的选择器部件是类选择器(.text.text-area),通用选择器(*)和后代选择器(之间的.text-area*.text)。

但是,有多种方法可以从代码设置对齐方式:

使用伪类

伪类可用于区分居中的TextArea和非居中的。{/ p>

PseudoClass centered = PseudoClass.getPseudoClass("centered");

// activate pseudoclass
textArea.pseudoClassStateChanged(centered, true);

// deactivate pseudoclass
textArea.pseudoClassStateChanged(centered, false);

CSS

.text-area:centered .text {
    -fx-text-alignment: center;
}

同样可以使用一个类,但它不太方便,因为类可以多次添加。

使用自定义CSS变量

CSS变量的值是从父节点继承的,这就是为什么你可以使用它来使用内联样式分配子节点的属性的原因:

CSS

.text-area {
    /* default value of variable */
    alignment: left;
}

.text-area .text {
    /* use variable for TextArea child */
    -fx-text-alignment: alignment;
}
// overwrite variable from inline style
textArea.setStyle("alignment: center;");

使用Node

查找lookupAll

这是最糟糕的选择,因为它需要ControlTextArea一样创建skin,这在布局之前不会发生,这意味着代码赢得了#t工作直到第一次布局通过。

// find children matching .text and assign set the property for each one
textArea.lookupAll(".text").forEach(n -> n.setStyle("-fx-text-alignment: center;"));