2016-11-28 1 views
4

Je travaille sur une application qui utilise un objet JTextfield comme composant d'entrée de texte. Au cours de certains tests, j'ai vu que tous les caractères chinois ne peuvent pas être affichés en utilisant ce composant. Au début, cela semble normal: certains caractères chinois sont si gros qu'ils ne sont même pas couverts par Unicode, ce qui (à mon humble avis) explique pourquoi ils ne peuvent pas être copiés dans le presse-papier (seulement comme bitmap, ce qui signifie ne peut pas être testé).Tout descendant ou remplacement JTextField qui couvre plus de caractères chinois?

Cependant, il semble également y avoir des caractères, comme le caractère de quatre dragon (expliqué dans l'URL Largest Chinese character in Unicode) qui peut être copié dans le presse-papiers, mais qui semble ne pas être accepté par l'objet JTextField.

D'où ma question: existe-t-il un descendant de JTextField qui couvre tous les caractères chinois, ou du moins ceux présents dans Unicode? Ou est-ce que quelqu'un est au courant d'un autre composant plus puissant?

Merci à l'avance

+0

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

+0

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

+0

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

Répondre

1

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

0

Comme @Enwired dit, utilisez une police qui prend en charge plus de caractères. Les polices ne sont que des images qui contiennent tous les caractères et des informations sur la façon de les afficher. Ainsi, une police avec plus de caractères ou une police conçue pour les caractères chinois fonctionnera beaucoup mieux. This site fonctionne très bien pour trouver des polices. Il en a beaucoup qui peuvent répondre à vos besoins.