gpt4 book ai didi

java - 如何设置 "backup"字体

转载 作者:行者123 更新时间:2023-11-30 05:59:10 25 4
gpt4 key购买 nike

我正在使用 Java 10 和 swing。我使用 DejaVu Sans Mono 字体,因为我觉得它看起来不错。然而,它对 CJK 字符的支持非常差,因此为了最大限度地支持,我想到使用 Noto Sans CJK 作为备份。虽然我也可以使用 Noto Sans 来表示拉丁字符,但我不太喜欢它们的拉丁字符。

虽然这看起来是一个微不足道的问题,但我似乎不知道该怎么做。即使您无法回答,我也很感激您的指点。

TL;博士:

我的问题

我无法使用 DejaVu Sans Mono 显示中文、日文或韩文字符

我的解决方案

使用 Noto Sans CJK

我的解决方案存在的问题

Noto Sans 的拉丁语版本很难看,而且不支持阿拉伯语

我的问题

如何告诉 JComponent 如果在字体一 (DejaVu) 中找不到字符,则应使用字体二 (Noto)?

最佳答案

一种方法是在制作组件(并设置文本)时检查字体是否能够显示相关字符。

这可以使用 Font.canDisplayUpTo(String) 等方法来实现.

E.G.

enter image description here

import java.awt.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.util.*;

public class FallbackFont {

private JComponent ui = null;
private final String[] fontFamilies = GraphicsEnvironment.
getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
String[] examplesTexts = {
"The quick brown fox jumps over the lazy dog.", // English
"\u6253\u5370\u8FC7\u671F\u8BC1\u4E66\u8BB0\u5F55", // Chinese
"\u0627\u0644\u0633\u0644\u0627\u0645 "
+ "\u0639\u0644\u064A\u0643\u0645", // Arabic
new String(Character.toChars(128176))
};
String[] preferredFonts = {
"DejaVu Sans Mono",
"Microsoft JhengHei",
"Noto Sans CJK TC Black", // has strange display problem here ..
};

FallbackFont() {
initUI();
}

private HashMap getCompatibleFonts(String text) {
HashMap cF = new HashMap<>();
for (String font : fontFamilies) {
Font f = new Font(font, Font.PLAIN, 1);
if (f.canDisplayUpTo(text) < 0) {
cF.put(font, f);
}
}
return cF;
}

private Font getPreferredFontForText(String text) {
HashMap compatibleFonts = getCompatibleFonts(text);
for (String preferredFont : preferredFonts) {
Font font = (Font) compatibleFonts.get(preferredFont);
if (font != null) {
return font;
}
}
Set keySet = compatibleFonts.keySet();
String firstCompatibleFont = (String) keySet.iterator().next();
return (Font) compatibleFonts.get(firstCompatibleFont);
}

public final void initUI() {
if (ui != null) {
return;
}

ui = new JPanel(new GridLayout(0, 2, 4, 4));
ui.setBorder(new EmptyBorder(4, 4, 4, 4));
for (String text : examplesTexts) {
Font font = getPreferredFontForText(text);
JButton b = new JButton(text);
b.setFont(font.deriveFont(b.getFont().getSize2D()));
ui.add(b);
ui.add(new JLabel(font.getName()));
}
}

public JComponent getUI() {
return ui;
}

public static void main(String[] args) {
Runnable r = () -> {
FallbackFont o = new FallbackFont();

JFrame f = new JFrame(o.getClass().getSimpleName());
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.setLocationByPlatform(true);

f.setContentPane(o.getUI());
f.pack();
f.setMinimumSize(f.getSize());

f.setVisible(true);
};
SwingUtilities.invokeLater(r);
}
}

关于java - 如何设置 "backup"字体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52552278/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com