我正在开发一个应用程序,它使用 JTextfield 对象作为文本输入组件。在一些测试中,我发现使用这个组件并不是所有的汉字都可以显示。
乍一看,这似乎很正常:有些汉字太大了,甚至连 Unicode 都没有覆盖,这(以我的拙见)解释了为什么不能将它们复制到剪贴板(只能作为位图,这意味着字体修改可以' 不被测试)。

但是,似乎也有一些字符,例如可以复制到剪贴板的四龙字符(在 URL Largest Chinese character in Unicode 中解释),但 JTextField 对象似乎不接受它。

因此我的问题是:是否有 JTextField 的后代涵盖所有汉字,或者至少是 Unicode 中存在的汉字?或者有人知道另一个更强大的组件吗?

提前致谢

最佳答案

使用 JTextField 您需要指定一种可以支持您想要使用的所有字符的字体。

如果您想支持大量字符,这可能是不可能的。例如,字体 MingLiU-ExtB 支持一些不常见的汉字,如 𪚥 ,但不支持 漢字 等常见的汉字。
Arial Unicode MSMingLiU 等字体支持常见字符,但不支持不常见字符。

因此,使用 JTextField 可能是不可能的。

但是,JTextPane 更灵活,至少在 Windows 上运行时是这样。如果它需要一些您指定的字体中没有的字符,它将添加来自其他后备字体的字符。 (我不知道它使用什么算法来选择其他字体。这种行为可能来自 Windows 本身,而不是来自 Java:参见 Font Fallback here 的讨论。)

这段代码给出了一些带有一些字体的 JTextFieldJTextPane 的例子。

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/

10-11 02:47