使用 JavaFX 进行字体选择和渲染

时间:2021-08-01 23:28:27

标签: java css javafx fonts

我有一个包含以下代码的 Swing 程序:

font = new Font(Font.SANS_SERIF, Font.PLAIN, 8);

呈现如下:enter image description here

我选择这个是因为我想要简单的字体,而且我想要它“便携”。

在 JavaFX 中,我有:

font = Font.font("SansSerif", 8);

我曾希望得到类似的结果,但我得到了:enter image description here

它看起来是粗体的。

我已经尝试了所有 JavaFX 选项,例如 font = Font.font("SansSerif", FontWeight.NORMAL, 8)

我尝试过不同的重量:轻、薄等

我直接尝试过 Helvetica。我试过阿里尔。他们看起来都一样。

我编写了一个简单的采样器,您可以在其中选择字体名称并查看您得到的内容。很多字体有不同的名称,但根本没有改变。

我浏览了 Helvetica:Helvetica、Helvetica Bold、Helvetica Bold Oblique、Helvetica Light、Helvetica Light Oblique。它们看起来都一样,没有一个是粗体,没有一个是斜体或浅色或任何东西。这些名字似乎没有任何区别。

有些作品,Monospace 作品,Times 作品——因为它们不是 SansSerif/Helvetica。

现在,对于 JavaFX,我只是在做:

Text t = new Text(x, y, text);
t.setFont(font);
getChildren.add(t);

我不会有意地将 CSS 用于任何用途。我没有 CSS 文件。

所以,我不知道为什么我的字体选择不起作用。

这是我的字体选择器实验的代码。

很明显,我认为我在 JavaFX 中缺少一些基本的字体和文本内容。

public class App extends Application {
    @Override
    public void start(Stage stage) {
        FontControlPane pane = new FontControlPane();
        var scene = new Scene(pane, 640, 480);
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch();
    }
}
public class FontControlPane extends Pane {
    FontSizePane fsPane;
    ComboBox<String> comboBox;

    public FontControlPane() {
        fsPane = new FontSizePane();
        ObservableList<String> families = FXCollections.observableList(Font.getFontNames());
        comboBox = new ComboBox<>(families);
        comboBox.setOnAction(e -> fsPane.setFontName(comboBox.getValue()));
        populateMap();
    }

    private void populateMap() {
        ObservableList<Node> list = getChildren();
        list.clear();
        BorderPane pane = new BorderPane();
        pane.setTop(comboBox);
        pane.setCenter(fsPane);
        list.add(pane);
    }
}
public class FontSizePane extends Pane {
    String fontName;

    public FontSizePane() {
        this.fontName = fontName;
        populate();
    }

    public String getFontName() {
        return fontName;
    }

    public void setFontName(String fontName) {
        this.fontName = fontName;
        populate();
    }

    private void populate() {
        ObservableList<Node> list = getChildren();
        list.clear();
        setBackground(new Background(new BackgroundFill(Color.WHITE, CornerRadii.EMPTY, Insets.EMPTY)));
        if (fontName == null) {
            Text t = new Text(0, 20, "No font selected");
            list.add(t);
            return;
        }

        Set<Line> lines = new HashSet<>();

        Text t = new Text(0, 20, fontName);
        list.add(t);
        double y = 30;
        double x = 0;
        String text = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz 0123456789";
        for (int size = 4; size < 72; size += 4) {
            Font f = Font.font(fontName, size);
            t = new Text(x, y, text);
            t.setFont(f);
            list.add(t);

            y += (t.getLayoutBounds().getHeight() + 2);
        }
    }
}

1 个答案:

答案 0 :(得分:4)

JavaFX 使用 CSS generic font families。 (在我的 Linux 系统上,serifsans-serifmonospace 有效,但 cursivefantasy 无效。)

据我所知,没有名为 Ariel 的字体。也许你的意思是阿里al?

只有在您的计算机上实际安装了该字体时,Helvetica 才能使用。据我所知,Windows 默认不附带 Hel​​vetica。

更新:

这一行不正确:

ObservableList<String> families = FXCollections.observableList(Font.getFontNames());

getFontNames 方法不返回有效的系列。为此,请使用 Font.getFamilies()