【发布时间】:2014-12-12 23:38:22
【问题描述】:
为了增强我们文本的可读性,有人建议我们对标签控件的文本进行勾勒。我知道您可以描边文本形状,但我们使用了标签。我忘记了原因,但我认为这是因为标签可以为我们做一些文本形状不能做的事情。
如何在标签的字母和单词周围画出轮廓或边框?
我尝试了-fx-stroke,但没有成功,-fx-border 只是在节点周围画了一个边框。有没有办法让这个工作?
【问题讨论】:
为了增强我们文本的可读性,有人建议我们对标签控件的文本进行勾勒。我知道您可以描边文本形状,但我们使用了标签。我忘记了原因,但我认为这是因为标签可以为我们做一些文本形状不能做的事情。
如何在标签的字母和单词周围画出轮廓或边框?
我尝试了-fx-stroke,但没有成功,-fx-border 只是在节点周围画了一个边框。有没有办法让这个工作?
【问题讨论】:
使用 CSS 指定标签文本的轮廓。
/** file: outline.css (place in same directory as OutlinedLabelText) */
.label {
-fx-font-size: 50px;
}
.outline.label .text {
-fx-fill: lightseagreen;
-fx-stroke: firebrick;
-fx-stroke-width: 2px;
}
示例用法:
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
public class OutlinedLabelText extends Application {
@Override
public void start(Stage stage) throws Exception {
Label label = new Label("Outlined");
label.getStyleClass().add("outline");
StackPane layout = new StackPane(label);
layout.setPadding(new Insets(10));
Scene scene = new Scene(layout, Color.PALEGREEN);
scene.getStylesheets().addAll(getClass().getResource(
"outline.css"
).toExternalForm());
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
上面的示例使用未记录的选择器从标签中选择用于样式的文本。通常,作为包含子节点的父节点的复杂节点的JavaFX CSS documentation 在文档的标题为“子结构”的部分中包含子节点部分。对于Labeled,没有提供子结构,但如果有,它会显示如下内容:
子结构
- text — Labeled 中的文本节点
我使用诸如ScenicView 之类的场景图自省工具找到了.text 选择器。对于 Java 9,JavaFX 实现在类构造函数的代码中为以下类设置样式类:com.sun.javafx.scene.control.LabeledText,它在其中调用 getStyleClass().addAll("text");。所以无论如何,这就是出现有点神奇的子组件类.text 的来源。
【讨论】: