我正在开发一个应用程序,它使用 JTextfield 对象作为文本输入组件。在一些测试中,我发现使用这个组件并不是所有的汉字都可以显示。
乍一看,这似乎很正常:有些汉字太大了,甚至连 Unicode 都没有覆盖,这(以我的拙见)解释了为什么不能将它们复制到剪贴板(只能作为位图,这意味着字体修改可以' 不被测试)。
但是,似乎也有一些字符,例如可以复制到剪贴板的四龙字符(在 URL Largest Chinese character in Unicode 中解释),但 JTextField 对象似乎不接受它。
因此我的问题是:是否有 JTextField 的后代涵盖所有汉字,或者至少是 Unicode 中存在的汉字?或者有人知道另一个更强大的组件吗?
提前致谢
最佳答案
使用 JTextField
您需要指定一种可以支持您想要使用的所有字符的字体。
如果您想支持大量字符,这可能是不可能的。例如,字体 MingLiU-ExtB
支持一些不常见的汉字,如 𪚥
,但不支持 漢字
等常见的汉字。Arial Unicode MS
或 MingLiU
等字体支持常见字符,但不支持不常见字符。
因此,使用 JTextField
可能是不可能的。
但是,JTextPane
更灵活,至少在 Windows 上运行时是这样。如果它需要一些您指定的字体中没有的字符,它将添加来自其他后备字体的字符。 (我不知道它使用什么算法来选择其他字体。这种行为可能来自 Windows 本身,而不是来自 Java:参见 Font Fallback here 的讨论。)
这段代码给出了一些带有一些字体的 JTextField
和 JTextPane
的例子。
public class ChineseFont {
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
String text = "test 𪚥 test 漢字.";
JTextField textField1 = new JTextField(text);
textField1.setFont(new Font("Arial Unicode MS", Font.PLAIN, 24));
JLabel label1 = new JLabel("JTextField " + textField1.getFont().getFontName());
JTextField textField2 = new JTextField(text);
textField2.setFont(new Font("MingLiU", Font.PLAIN, 24));
JLabel label2 = new JLabel("JTextField " + textField2.getFont().getFontName());
JTextField textField3 = new JTextField(text);
textField3.setFont(new Font("MingLiU-ExtB", Font.PLAIN, 24));
JLabel label3 = new JLabel("JTextField " + textField3.getFont().getFontName());
JTextPane textPane4 = new JTextPane();
textPane4.setFont(new Font("Arial Unicode MS", Font.PLAIN, 24));
textPane4.setText(text);
JLabel label4 = new JLabel("JTextPane " + textPane4.getFont().getName());
JTextPane textPane5 = new JTextPane();
textPane5.setFont(new Font("MingLiU", Font.PLAIN, 24));
textPane5.setText(text);
JLabel label5 = new JLabel("JTextPane " + textPane5.getFont().getName());
JFrame frame = new JFrame();
Container contentPane = frame.getContentPane();
contentPane.setLayout(new GridLayout(5, 2, 2, 6));
contentPane.add(label1);
contentPane.add(textField1);
contentPane.add(label2);
contentPane.add(textField2);
contentPane.add(label3);
contentPane.add(textField3);
contentPane.add(label4);
contentPane.add(textPane4);
contentPane.add(label5);
contentPane.add(textPane5);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
});
}
}
您还可以使用
AttributedText
为文本的每个部分手动指定字体。见 this answer关于java - 任何涵盖更多汉字的 JTextField 后代或替代品?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40840115/