任何覆盖更多汉字的 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 MSMingLiU 等字体支持常见字符,但不支持不常见字符。

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

但是,JTextPane 更灵活,至少在 运行 和 Windows 上是这样。如果它需要一些不在您指定的字体中的字符,它将添加来自其他后备字体的字符。 (我不知道它对 select 其他字体使用什么算法。这种行为可能来自 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

如@Enwired 所说,使用支持更多字符的字体。字体只是包含所有字符和有关如何显示它们的信息的图片。因此,具有更多字符的字体或专为汉字设计的字体效果会更好。 This site 非常适合查找字体。它有许多可能适合您的需求。