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

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

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

呈现如下:

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

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

在 JavaFX 中,我有:

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

我曾希望得到类似的结果,但我得到了:

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

它看起来是粗体的。

我已经尝试了所有 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,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,text);
            t.setfont(f);
            list.add(t);

            y += (t.getLayoutBounds().getHeight() + 2);
        }
    }
}
zxf880820 回答:使用 JavaFX 进行字体选择和渲染

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()

本文链接:https://www.f2er.com/194.html

大家都在问