2010-05-29 31 views
4

當我開始使用JDK6進行編程時,文本組件在AWT和Swing中都沒有問題。AWT格式錯誤的波斯語字符

但是對於標籤或標題AWT組件我確實有問題。我無法在AWT組件上顯示波斯語字符(在Swing中,我將它們鍵入到源代碼中)。

這裏是我的示例代碼:

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); 
    } 
} 

這三種方法都工作時,與IDE中運行,但是當我做含有此一等級JAR(通過的NetBeans>項目的手段>清潔&構建),我沒有看到預期的字符(它顯示空/空白方塊)!

注: 看來我不能附加任何東西,所以文本文件的內容是這樣的:نمایش和屬性文件的內容:

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

而且我覺得我有讓你知道我前不久在SDN和「Java牧場」論壇和其他本地論壇上發佈了這個問題,但我還在等待...

順便說一下,我使用的是最新版本的Netbeans IDE .. 。

我會很感激,如果任何人有一個解決方案,這些該死的AWT組件從未渲染任何波斯語角色對我來說...

+0

親愛的垃圾桶,我一定很想觸發那個標誌,但是好像是因爲我在這裏是一個tyro,我不能,但是隻要我有足夠的聲譽來做到這一點,我會盡快做到這一點(我不熟悉這個網站非常...) 謝謝 – jlover2010 2010-05-30 20:11:08

+0

有趣。我不能對你的答案投票,不知何故,系統認爲這是我的,也許是由於稱呼。 – trashgod 2010-05-30 21:21:07

+0

是的,就是這樣。我已經投了你的問題和答案。 – trashgod 2010-05-30 21:23:17

回答

2

您的回覆的最精彩的部分是: 「$ Java的罐子dist/test6.jar「! 它真的顯示真正的字符(就像框架標題)?! 而不是盒子或垃圾? 對不起,如果我相信它很難,因爲我在Java開發工作中遇到的唯一問題需要很長時間,沒有任何答案也沒有搜索,也沒有在論壇上提出這個問題!

那麼,我該怎麼辦?我應該使用什麼字體?不幸的是,我對字體不太熟悉,直到現在我只使用了Java(Serif,SansSerif等)中的全局字體,並且只是修改了它們的大小或樣式,但是在您建議我通過這些代碼檢查了幾個Persian ttf字體:

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

只是盒是結果! (剛剛使用HardCoding) 我想我應該提到我的環境是win xp,我不僅在我的機器上有這個問題,而且還有另一個運行xp os的問題。我正在使用jdk6u17。

我可以同意你懷疑字體,因爲編碼問題(以我的經驗)出現時帶有問號,但與渲染字符相關的垃圾或空盒子。 但我仍然有問題,就像第一天:( 你用什麼字體,我遇到的另外一個問題是:爲什麼 擺動沒有任何問題,沒有指定字體,但AWT

附錄。:感謝Oscar Reyesthis page中給予this link並感謝StackOverflow :) 他們救了我!從this section我應該引用:

使用對等AWT組件的應用程序只能使用邏輯字體名稱。

this section應該報價:

對於應用程序中使用AWT凝視組件,Sun公司的JRE爲中國,日本,還是韓國選擇的字體只在本地化爲這些特定語言的主機操作系統上運行時

是的,你猜對了!通過將OS語言環境設置爲波斯語,我得到了正確的結果。

但我仍然應該研究,看看如何通過不從該文章設置正確的區域設置來獲得正確的結果。

我會解釋一下,當我得到的結果,但仍然會聽到這裏。祝我好運。

3

我懷疑這是平臺相關的。您的示例似乎在我的平臺上使用Netbeans或命令行中的方法1工作;我沒有嘗試其他方法。

IDE和命令行之間在默認字符編碼方面可能存在差異。我注意到NetBeans,Eclipse和許多控制檯可以設置爲除平臺默認設置之外的其他設置。這裏的代碼來檢查:

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

你可以看看這個相關question了。

附錄:備註show字符串更改爲匹配JFrame標題進行比較。標題和菜單看起來是一樣的,從NetBeans的Run > Run Project以及通過這些命令行:

 
$ 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

您是否注意到當JAR文件由此類創建時,我正在討論IDE?或者你只是從IDE(或命令行) 檢查approach1,因爲問題是在打包歸檔後(如我在我的問題中提到的,代碼後) 如果你從JAR得到正確的結果,我會驚訝! 同樣這兩種編碼檢查的結果是「utf-8」 THX – jlover2010 2010-05-29 15:56:51

+0

如果它不是編碼它可能是字體;它在Mac OS X和Ubuntu上看起來不錯。 – trashgod 2010-05-29 18:39:33

+0

@ jlover2010:我希望你不要讓我在波斯發表調皮的東西。 :-) – trashgod 2010-05-30 18:09:35