2015-03-04 29 views
5

A String böyle boyanabilir:Boyama Japon karakterler

@Override 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Graphics2D g2d = (Graphics2D) g.create(); 

    try { 

     g2d.setColor(Color.BLACK); 

     g2d.setFont(new Font("Serif", Font.PLAIN, 12));//Japanese characters are visible 
     //g2d.setFont(new Font("Arial", Font.PLAIN, 12));//Japanese characters are not visible (squares only) 

     g2d.drawString("Berryz工房 『ROCKエロティック』(Berryz Kobo[Erotic ROCK]) (MV)", 10, 45); 

    } finally { 
     g2d.dispose(); 
    } 
} 

Sorun g2d.setFont(new Font("Arial", Font.PLAIN, 12)); yaparsak olmasıdır - Japon karakterler sadece görünmez yerine kareler:

enter image description here

Ve g2d.setFont(new Font("Serif", Font.PLAIN, 12)); gibi yazı tipi ayarlarsanız - her şey çalışıyor:

Arial yazı tipi seçilirse

enter image description here

Örneğin, MS WordPad karakterler görülebilir:

enter image description here

Ama Arial yazı kullanmak istiyorum. Belki Japon karakterini tespit etmeli ve farklı yazı tiplerine geçmeli ve sonra tekrar dönmeliyim?

+0

enter image description here

[Arial Unicode] (http://www.fonts.com/font/monotype/arial-unicode) Katakana çizmek gerekir, ama ucuz değildir: D. WordPad örneğiniz hakkında: Eğer Word'ü kullanırsam, o zaman Katakana/Kanji için * MS Gothic * 'e geçecek ve over karakterler için Arial kullanacaktır. – Tom

+3

Muhtemelen [Font.canDisplayUpTo (String)] özelliğini kullanmanız gerekir (http://docs.oracle.com/javase/7/docs/api/java/awt/Font.html#canDisplayUpTo%28java.lang.String%29) Arial'in nerede görüntülenebileceğini kontrol etmek için Japon yazı tipine geçin ve tüm yazı yazılana kadar tekrarlayın. Seçilen ana yazı karakteri karakter oluşturamazsa, Wordpad ve MS Word, belirli bir komut dizisi için bazı varsayılan yazı tiplerine geri dönecektir. – nhahtdh

+0

Evet, 'Font.canDisplayUpTo (String)' burada yardımcı olacaktır, ancak nasıl uygulanacağı .. :) Başka bir bulmaca, ama en azından mümkün. Arial Unicode - büyük olabilir, ama ticari uygulamalarla gemiye izin vermek ne kadar mal olur? .. –

cevap

7

Mantıksal yazı tiplerini kullanarak çalışır. SANS_SERIF, Windows'ta Arial (öncelikli) olacaktır.

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

public class FontTestWithJapaneseCharacters { 

    private JComponent ui = null; 

    class PaintingSurface extends JPanel { 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(400, 20); 
     } 

     @Override 
     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g; 
      g2d.setColor(Color.BLACK); 
      g2d.setFont(new Font(Font.SANS_SERIF, Font.PLAIN, 12)); 
      g2d.drawString("Berryz工房 『ROCKエロティック』" 
        + "(Berryz Kobo[Erotic ROCK]) (MV)", 10, 15); 
     } 
    } 

    FontTestWithJapaneseCharacters() { 
     initUI(); 
    } 

    public void initUI() { 
     if (ui != null) { 
      return; 
     } 

     ui = new PaintingSurface(); 
    } 

    public JComponent getUI() { 
     return ui; 
    } 

    public static void main(String[] args) { 
     Runnable r = new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(
          UIManager.getSystemLookAndFeelClassName()); 
       } catch (Exception useDefault) { 
       } 
       FontTestWithJapaneseCharacters o 
         = new FontTestWithJapaneseCharacters(); 

       JFrame f = new JFrame("Font test with Japanese characters"); 
       f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       f.setLocationByPlatform(true); 

       f.setContentPane(o.getUI()); 
       f.pack(); 
       f.setMinimumSize(f.getSize()); 

       f.setVisible(true); 
      } 
     }; 
     SwingUtilities.invokeLater(r); 
    } 
} 
+0

Diğer platformlarda nasıl performans gösterdiğini bilmek çok güzel olurdu. Gerçekten yardım için teşekkürler. –

+0

Rica ederim. :) –