С JTextField
вам нужно будет указать шрифт, который может поддерживать все символы, которые вы хотите использовать.
Это может быть невозможно, если вы хотите поддерживать большое количество символов. Например, шрифт MingLiU-ExtB
поддерживает некоторые необычные китайские символы, такие как ????
, но не поддерживает распространенные китайские символы, такие как 漢字
.
Такие шрифты, как Arial Unicode MS
или MingLiU
, поддерживают распространенные символы, но не редкость.
Таким образом, это может быть невозможно с JTextField
.
Но JTextPane
более гибкий, по крайней мере, при работе в Windows. Если ему нужны символы, которых нет в указанном вами шрифте, он добавит символы из других резервных шрифтов. (Я понятия не имею, какой алгоритм он использует для выбора других шрифтов. Такое поведение может исходить из самой Windows, а не из Java: см. обсуждение Font Fallback здесь.)
Этот код дает несколько примеров 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
. См. этот ответ
person
Enwired
schedule
03.12.2016
JTextField
может использовать один единственный шрифт. КаждыйJTextPane
может использовать несколько шрифтов, и, по крайней мере, в Windows он использует резервные шрифты для символов, не включенных в выбранный шрифт. - person Enwired   schedule 05.12.2016