2016-04-25 50 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)。 –