任何覆盖更多汉字的 JTextField 后代或替代者?
Any JTextField descendant or replacement who covers more Chinese characters?
我正在开发一个应用程序,它使用 JTextfield 对象作为文本输入组件。在一些测试中,我发现并不是所有的汉字都可以使用这个组件显示。
乍一看这似乎很正常:有些汉字大到 Unicode 都无法覆盖,这(以我的愚见)解释了为什么它们不能复制到剪贴板(只能作为位图,这意味着字体修改可以待测)。
然而,似乎还有一些字符,如四龙字符(在URL Largest Chinese character in Unicode中解释)可以复制到剪贴板,但似乎不被 JTextField 接受对象。
因此我的问题是:是否有任何 JTextField 的后代涵盖所有汉字,或者至少是 Unicode 中存在的汉字?或者有人知道另一个更强大的组件吗?
提前致谢
对于 JTextField
,您需要指定一种可以支持您要使用的所有字符的字体。
如果你想支持大量的字符,这可能是不可能的。例如,字体MingLiU-ExtB
支持</code>等一些不常见的汉字,但不支持<code>漢字
.
等常见汉字。
Arial Unicode MS
或 MingLiU
等字体支持常见字符,但不支持不常见字符。
因此,JTextField
可能是不可能的。
但是,JTextPane
更灵活,至少在 运行 和 Windows 上是这样。如果它需要一些不在您指定的字体中的字符,它将添加来自其他后备字体的字符。 (我不知道它对 select 其他字体使用什么算法。这种行为可能来自 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
如@Enwired 所说,使用支持更多字符的字体。字体只是包含所有字符和有关如何显示它们的信息的图片。因此,具有更多字符的字体或专为汉字设计的字体效果会更好。 This site 非常适合查找字体。它有许多可能适合您的需求。
我正在开发一个应用程序,它使用 JTextfield 对象作为文本输入组件。在一些测试中,我发现并不是所有的汉字都可以使用这个组件显示。 乍一看这似乎很正常:有些汉字大到 Unicode 都无法覆盖,这(以我的愚见)解释了为什么它们不能复制到剪贴板(只能作为位图,这意味着字体修改可以待测)。
然而,似乎还有一些字符,如四龙字符(在URL Largest Chinese character in Unicode中解释)可以复制到剪贴板,但似乎不被 JTextField 接受对象。
因此我的问题是:是否有任何 JTextField 的后代涵盖所有汉字,或者至少是 Unicode 中存在的汉字?或者有人知道另一个更强大的组件吗?
提前致谢
对于 JTextField
,您需要指定一种可以支持您要使用的所有字符的字体。
如果你想支持大量的字符,这可能是不可能的。例如,字体MingLiU-ExtB
支持</code>等一些不常见的汉字,但不支持<code>漢字
.
Arial Unicode MS
或 MingLiU
等字体支持常见字符,但不支持不常见字符。
因此,JTextField
可能是不可能的。
但是,JTextPane
更灵活,至少在 运行 和 Windows 上是这样。如果它需要一些不在您指定的字体中的字符,它将添加来自其他后备字体的字符。 (我不知道它对 select 其他字体使用什么算法。这种行为可能来自 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
如@Enwired 所说,使用支持更多字符的字体。字体只是包含所有字符和有关如何显示它们的信息的图片。因此,具有更多字符的字体或专为汉字设计的字体效果会更好。 This site 非常适合查找字体。它有许多可能适合您的需求。