2016-04-25 49 views
0

使用Java JTextPane構建的我的記事本在編寫英文時工作得很好。然而,用其他語言寫的字母,在我的例子中是Bangla,顯示空的方塊。我該如何解決問題?在Java中編寫UTF-8字符JTextPane

+1

我以前有這個問題。答案是你需要使用一個UTF字體 – ControlAltDel

回答

2

在運行時,我們可以使用Font.canDisplayUpTo(String)來確定哪些安裝的字體可以顯示給定的文本。邏輯字體(如Font.SANS_SERIFFont.SERIF)通常由其他字體組成,可涵蓋大量不同的腳本。

下面是一個使用斯洛文尼亞語文本的示例,結果顯示在此機器上。

enter image description here

import java.awt.*; 
import javax.swing.*; 
import javax.swing.event.*; 
import javax.swing.border.EmptyBorder; 
import java.util.Vector; 

public class CroationTextInGUI { 

    private JComponent ui = null; 
    private String text = "Bohinjska Češnjica"; 

    CroationTextInGUI() { 
     initUI(); 
    } 

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

     ui = new JPanel(new BorderLayout(4,4)); 
     ui.setBorder(new EmptyBorder(4,4,4,4)); 

     String[] fontFamilies = GraphicsEnvironment. 
       getLocalGraphicsEnvironment(). 
       getAvailableFontFamilyNames(); 
     Vector<String> croatFreindlyFonts = new Vector<String>(); 
     for (String name : fontFamilies) { 
      Font font = new Font(name, Font.PLAIN, 20); 
      if (font.canDisplayUpTo(text)<0) { 
       croatFreindlyFonts.add(name); 
      } 
     } 
     final JList list = new JList(croatFreindlyFonts); 
     list.setVisibleRowCount(20); 
     list.getSelectionModel().setSelectionMode(
       ListSelectionModel.SINGLE_SELECTION); 
     ui.add(new JScrollPane(list), BorderLayout.LINE_START); 

     final JTextArea output = new JTextArea(text, 2, 12); 
     output.setLineWrap(true); 
     output.setWrapStyleWord(true); 
     ui.add(new JScrollPane(output)); 

     ListSelectionListener showFontListener = new ListSelectionListener() { 

      @Override 
      public void valueChanged(ListSelectionEvent e) { 
       Font f = new Font(
         list.getSelectedValue().toString(), Font.PLAIN, 50); 
       output.setFont(f); 
      } 
     }; 
     list.addListSelectionListener(showFontListener); 
     list.setSelectedIndex(0); 
    } 

    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) { 
       } 
       CroationTextInGUI o = new CroationTextInGUI(); 

       JFrame f = new JFrame("Croation Text in GUI"); 
       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

如果它有助於解決問題,請[接受答案](http://meta.stackexchange.com/a/5235/155831)。 –