文字行高

时间:2013-08-14 01:19:43

标签: javafx-2 javafx javafx-8

如何在多行文本/标签中指定行高?

它似乎在css中不受支持:

  

JavaFX CSS不支持以逗号分隔的字体系列   -fx-font-family属性中的名称。可选的行高   不支持指定字体时的参数。没有   等效于font-variant属性。

这是否有原因?

是否可以在代码中设置此选项?或者有点模仿功能?我想在我的应用程序中控制垂直节奏。

1 个答案:

答案 0 :(得分:3)

Java 8+实现

实现

RT-21683 Allow to change line-to-line spacing以向JavaFX Java 8添加行间距功能。

行spacibg API通过lineSpacing属性和关联的getter和setter在Text,TextFlow和Labeled节点上定义。间距以像素为单位定义,与JavaFX布局的其余部分一样。

Java 2.2-实现

如果您不能使用Java 8+,则需要自己实现行间距,例如:通过在VBox上设置每行的单独文本节点的间距。

讨论JavaFX中的单元测量

  

似乎有一个相应的(可设置的)css属性?如果它以像素为单位定义,我该如何使其成为dpi识别

如果您使用它们,css属性工作可以与em单位一起使用。例如,请参阅默认的modena.css样式表,该样式表以em为单位测量几乎所有尺寸。这就是为什么如果您只使用没有基于像素的布局的默认样式,那么如果您更改根字体大小,布局中的所有内容都会自动缩放。

只有Java API和FXML才能使用像素单元。即使这样,JavaFX系统也足够聪明地知道(至少在某些机器上)它在HiDPI显示器(例如OS X视网膜)上运行,例如,pixel units are automatically doubled for the retina display (in Java 8)

如果您使用FXML,可以use expression bindings作为定义自己的单位系统的方法。

JavaFX的未来版本可能会为RT-14020 Concept for a screen resolution independent definition of a GUI提供更多支持。

示例代码

下面的示例使用Java 8来演示lineSpacing api和-fx-line-spacing css属性的用法。

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.stage.Stage;

public class LineSpacing extends Application {
    public static void main(String[] args) { launch(LineSpacing.class); }

    @Override public void start(Stage stage) {
        Label label = new Label(
            "Power is my mistress.\n" +
            "I have worked too hard at her conquest " +
            "to allow anyone to take her away from me.\n" +
            " - Napoleon Bonaparte");
        label.setPadding(new Insets(20));

        // as the default font spacing in JavaFX is 13 points, 
        // all of the following lines will provide the same results 
        // (double spacing the label text).
        //
        // label.setLineSpacing(13);
        // label.setStyle("-fx-line-spacing: 13px;");
        label.setStyle("-fx-line-spacing: 1em;");

        stage.setScene(new Scene(label));
        stage.show();
    }
}