2010-05-29 20 views
4

Lorsque j'ai commencé à programmer avec le JDK6, je n'avais aucun problème avec les composants textuels, ni dans AWT ni dans Swing.Caractères farsi mal formés sur AWT

Mais pour les étiquettes ou les titres Composants AWT J'ai un problème. Je ne peux pas afficher les caractères farsi sur les composants AWTs (dans Swing je les tape dans le code source).

Voici mon exemple de code:

import javax.swing.*; 
import java.awt.*; 
import java.io.*; 
import java.util.Properties; 

public class EmptyFarsiCharsOnAWT extends JFrame{ 

public EmptyFarsiCharsOnAWT() { 
    super("مثال"); 
    setDefaultCloseOperation(3); 
    setVisible(rootPaneCheckingEnabled); 
} 
public static void main(String[] args) throws AWTException, IOException { 
    JFrame jFrame = new EmptyFarsiCharsOnAWT(); 
    MenuItem show ; 
    // approach 1 = HardCoding : 
    /* 
    show = new MenuItem("\u0646\u0645\u0627\u06cc\u0634"); 
    * 
    */ 

    // approach 2 = using simple utf-8 saved text file : 
    /* 
     BufferedReader in = new BufferedReader(new FileReader("farsiLabels.txt")); 
     String showLabel = in.readLine(); 
     in.close(); 

     show = new MenuItem(showLabel); 
    * 
    */ 

    // approach 3 = using properties file : 

    FileReader in = new FileReader("farsiLabels.properties"); 
    Properties farsiLabels = new Properties(); 
    farsiLabels.load(in); 
    show = new MenuItem(farsiLabels.getProperty("tray.show")); 
    PopupMenu popUp = new PopupMenu(); 
    popUp.add(show); 

     // creating Tray object 
     Image iconIamge = Toolkit.getDefaultToolkit().getImage("greenIcon.png"); 

     TrayIcon trayIcon = new TrayIcon(iconIamge, null, popUp); 
     SystemTray tray = SystemTray.getSystemTray(); 
     tray.add(trayIcon); 

     jFrame.setIconImage(iconIamge); 
    } 
} 

Ces trois approches tout le travail lorsqu'il est exécuté avec un IDE, mais quand je fais un JAR contenant cette classe (au moyen de NetBeans> Projet> propre construction &), Je ne vois pas les caractères attendus (ça montre EMPTY/BLANK SQUARES)!

Note: Il semble que je ne peux pas fixer quoi que ce soit, de sorte que le contenu du fichier texte serait ceci: نمایش et le contenu du fichier de propriétés:

#Sun May 02 09:45:10 IRDT 2010 
tray.show=نمایش 

Et je pense que je dois sachez que j'ai posté cette question il y a un certain temps sur SDN et "le Java Ranch" forums et autres forums natifs et encore j'attends ...

Par la façon dont j'utilise la dernière version de Netbeans IDE ..

Je serai reconnaissant si quelqu'un a une solution à ces composants AWT satanés ne rendant aucun caractère persan pour moi ...

+0

cher trashgod, j'aime vraiment déclencher ce drapeau, mais semble parce que je suis un tyro ici, je ne peux pas, mais promis de le faire dès que j'ai assez de réputations pour le faire (je ne suis pas familier avec ce site beaucoup ...) Merci – jlover2010

+0

Intéressant. Je ne peux pas voter pour votre réponse. D'une certaine manière, le système pense que c'est à moi, peut-être en raison de la salutation. – trashgod

+0

Oui, c'était ça. J'ai voté pour votre question et votre réponse. – trashgod

Répondre

2

La partie la plus excitante de votre réponse était: "$ java -jar dist/test6.jar "! Est-ce qu'il montre vraiment les vrais personnages (tout comme le titre du cadre) ?! et pas des boîtes ou des ordures? Je suis désolé si je le crois dur, car le seul problème dans mon travail de développement avec Java a pris tant de temps sans aucune réponse ni de la recherche, ni de demander dans les forums est-ce!

Alors, que puis-je faire? quelle police dois-je utiliser?Malheureusement, je ne suis pas très familier avec les polices, jusqu'à présent, j'ai simplement utilisé des polices globales en Java (Serif, SansSerif, etc.) et seulement modifié leur taille ou leur style, mais après avoir suggéré que j'ai examiné plusieurs polices ttf perses :

 File fontFile = new File("F_JADID.TTF"); 
     Font font = Font.createFont(Font.TRUETYPE_FONT, fontFile); 
     show.setFont(font.deriveFont(15f)); 

mais seulement des boîtes était le résultat! (juste en utilisant HardCoding) Je pense que je devrais mentionner que mon environnement est win xp et j'ai ce problème non seulement dans ma machine, mais un autre xp fonctionnant aussi. Et j'utilise jdk6u17.

Je peux être d'accord avec vous pour soupçonner les polices, parce que le problème d'encodage (dans mon expérience) apparaît avec un point d'interrogation, mais la poubelle ou les boîtes vides liées au rendu des caractères. Mais j'ai encore le problème, tout comme le premier jour :( Qu'est-ce que la police que vous utilisez et une autre question que je rencontrais est la suivante: Pourquoi oscillation n'a pas de problème sans spécifier la police, mais AWT

Addendum.: Merci à Oscar Reyes en this page pour donner this link et grâce à StackOverflow :) Ils m'ont sauvé! de this section je devrais citer:

Une application utilisant des composants AWT peered ne peut utiliser que des noms de polices logiques.

et de this section devrait citer:

Pour les applications utilisant AWT scruta les composants, les JREs de Sun polices de sélection pour le chinois, japonais ou coréen uniquement lors de l'exécution sur les systèmes d'exploitation hôtes localisés pour ces langues spécifiques

Oui, vous devinez juste! En définissant les paramètres régionaux du système d'exploitation sur Farsi, j'ai obtenu le bon résultat.

mais je devrais toujours rechercher et voir comment est-il possible d'avoir le bon résultat en ne définissant pas les bonnes locales, à partir de cet article.

Je vais vous expliquer comment, quand j'ai obtenu le résultat, mais je vais encore écouter ici. souhaite moi bonne chance.

3

Je soupçonne que cette plate-forme est liée. Votre exemple semble fonctionner sur ma plate-forme en utilisant l'approche 1 dans Netbeans ou la ligne de commande; Je n'ai pas essayé les autres approches.

Il peut y avoir une disparité entre l'EDI et la ligne de commande en ce qui concerne le codage de caractères par défaut. J'ai remarqué que NetBeans, Eclipse et de nombreuses consoles peuvent être paramétrées sur autre chose que la plate-forme par défaut. Voici le code pour vérifier:

System.out.println(System.getProperty("file.encoding")); 
System.out.println(Charset.defaultCharset().name()); 

Vous pouvez regarder cette question connexe, aussi.

Addendum: Remarque show chaîne modifiée pour correspondre au titre JFrame à titre de comparaison. Le titre et le menu ont le même aspect de NetBeans' Run > Run Project ainsi que par ces lignes de commande:

 
$ java -cp build/classes EmptyFarsiCharsOnAWT 
$ java -jar dist/test6.jar 

http://i47.tinypic.com/mx1vvd.png http://i47.tinypic.com/mx1vvd.png

import javax.swing.*; 
import java.awt.*; 
import java.io.*; 

public class EmptyFarsiCharsOnAWT extends JFrame{ 

public EmptyFarsiCharsOnAWT() { 
    super("مثال"); 
    setDefaultCloseOperation(3); 
    setVisible(rootPaneCheckingEnabled); 
} 
public static void main(String[] args) throws AWTException, IOException { 
    JFrame jFrame = new EmptyFarsiCharsOnAWT(); 
    MenuItem show ; 
    // approach 1 = HardCoding : 
    show = new MenuItem("\u0645\u062b\u0627\u0644"); 
    PopupMenu popUp = new PopupMenu(); 
    popUp.add(show); 
     // creating Tray object 
     Image iconIamge = Toolkit.getDefaultToolkit().getImage("image.jpg"); 
     TrayIcon trayIcon = new TrayIcon(iconIamge, null, popUp); 
     SystemTray tray = SystemTray.getSystemTray(); 
     tray.add(trayIcon); 
     jFrame.setIconImage(iconIamge); 
    } 
} 
+0

Notez-vous que je parle de l'IDE, lorsque le fichier JAR est fait à partir de cette classe? ou vous venez de vérifier approach1 depuis IDE (ou la ligne de commande aussi) parce que le problème est après l'emballage de l'archive (comme je l'ai mentionné dans ma question, après les codes) si vous avez le bon résultat de JAR, je vais étonner! Le résultat des deux contrôles de codage est également "utf-8" THX – jlover2010

+0

Si ce n'est pas le codage, il peut s'agir de la police; Cela semble correct sur Mac OS X et Ubuntu. – trashgod

+0

@ jlover2010: J'espère que vous n'essayez pas de me faire publier quelque chose de méchant en farsi. :-) – trashgod