Avec JTextField
vous devez spécifier une police qui peut prendre en charge tous les caractères que vous souhaitez utiliser.
Cela peut être impossible si vous souhaitez prendre en charge un grand nombre de caractères. Par exemple, la police MingLiU-ExtB
prend en charge certains caractères chinois inhabituels tels que
, mais ne prend pas en charge les caractères chinois communs tels que 漢字
.
Des polices comme Arial Unicode MS
ou MingLiU
prennent en charge les caractères communs, mais ils ne sont pas rares.
Ainsi, il peut être impossible avec JTextField
. Cependant, JTextPane
est plus flexible, au moins sous Windows. S'il a besoin de caractères qui ne sont pas dans la police que vous avez spécifiée, il ajoutera des caractères d'autres polices de secours. (Je ne sais pas ce que l'algorithme qu'il utilise pour sélectionner les autres polices Ce comportement peut provenir de Windows lui-même, et non pas de Java:.. Voir la discussion de Font Fallback here)
Ce code donne quelques exemples de JTextField
et JTextPane
avec quelques polices.
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);
});
}
}
Vous pouvez également spécifier manuellement les polices pour chaque section de votre texte en utilisant AttributedText
. Voir this answer
Pourriez-vous donner un exemple de votre problème? Ce qui signifie une chaîne qui convient et une chaîne qui n'en a pas. Aussi, êtes-vous sûr d'utiliser l'encodage correct? Fournissez un [mcve] pour que nous puissions le tester s'il vous plaît. – AxelH
Je voudrais ajouter un exemple d'une phrase chinoise acceptée par le JTextField que j'utilise, mais il semble que je ne peux utiliser que des images en pièce jointe, le fichier RTF incluant la phrase n'est pas accepté (et une simple copie/le collage de caractères chinois ne fonctionne pas dans cette fenêtre de commentaire, cependant je suis sûr que beaucoup de caractères chinois sont acceptés, alors que seuls les plus grands posent des problèmes (comme celui du lien hypertexte) – Dominique
Habituellement le problème n'est pas avec JTextField lui-même , mais avec la police que vous utilisez.Vous devez trouver une police qui peut afficher les caractères que vous voulez. J'utilise normalement 'Arial Unicode MS' qui peut afficher la plupart des caractères Unicode, mais il ne peut pas afficher le caractère 'quatre dragon' – Enwired