我有一个包含以下代码的 Swing 程序:
font = new Font(Font.SANS_SERIF, Font.PLAIN, 8);
呈现如下:
我选择这个是因为我想要简单的字体,而且我想要它“便携”。
在 JavaFX 中,我有:
font = Font.font("SansSerif", 8);
我曾希望得到类似的结果,但我得到了:
它看起来是粗体的。
我已经尝试了所有 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);
}
}
}
答案 0 :(得分:4)
JavaFX 使用 CSS generic font families。 (在我的 Linux 系统上,serif
、sans-serif
和 monospace
有效,但 cursive
和 fantasy
无效。)
据我所知,没有名为 Ariel 的字体。也许你的意思是阿里al?
只有在您的计算机上实际安装了该字体时,Helvetica 才能使用。据我所知,Windows 默认不附带 Helvetica。
更新:
这一行不正确:
ObservableList<String> families = FXCollections.observableList(Font.getFontNames());
getFontNames 方法不返回有效的系列。为此,请使用 Font.getFamilies()。