2016-11-28 15 views
4

我正在处理一个应用程序,它使用JTextfield对象作为文本输入组件。在一些测试中,我发现并非所有的汉字都可以使用这个组件显示。 起初,这看起来很正常:一些中文字符非常大,甚至没有被Unicode覆盖,这在我看来很简单,它解释了为什么它们不能被复制到剪贴板(只能作为位图,这意味着字体修改不能被测试)。任何涵盖更多中文字符的JTextField后代或替换者?

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

因此,我的问题是:是否有JTextField的任何后代覆盖所有的中文字符,或至少在Unicode中存在的?还是有人知道另一个更强大的组件?

在此先感谢

+0

你能提供一个你的问题的例子吗?意思是适合的字符串,而不适合的字符串。另外,你确定你正在使用正确的编码?请提供一个[mcve]给我们来测试这个。 – AxelH

+0

我想添加一个中文句子的例子,它被我使用的JTextField所接受,但似乎我只能使用图像作为附件,包含句子的RTF文件不被接受(并且简单的复制/中文字符的粘贴在这个评论窗口中不起作用,但是我确定大量的中文字符被接受,而只有最大的中文字符出现问题(如超链接中的那个)。 – Dominique

+0

通常情况下,问题不在于JTextField本身,但是使用的是你正在使用的字体。你需要找到一个可以显示你想要的字符的字体。我通常使用'Arial Unicode MS',它可以显示大多数Unicode字符,但它不能显示'四条龙'字符 – Enwired

回答

1

随着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

0

像@Enwired所说的,使用支持更多字符的字体。字体只是包含所有字符以及如何显示它们的信息的图片。所以具有更多字符或用于汉字的字体的字体将会更好。 This site适用于查找字体。它有许多可能适合您的需求。

相关问题