2016-04-14 49 views
0

我已经制作了这个简单的程序,我希望在JTextArea中显示unicode符文字符\ u16e6。此符号显示在JFrame的顶部,但不显示在JTextArea中。我已经将JTextArea的字体设置为与JFrame相同,但它仍然只会显示为空白框。我怎样才能在JTextArea中显示这个或任何任意的Unicode字符?JTextArea组件中的Unicode支持

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


public class WTextArea{ 
    public static void main(String[] args){ 
     JFrame frame = new JFrame("\u16e6"); 
       frame.setSize(1000,1000); 
       frame.setVisible(true); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     System.out.println(frame.getFont().toString()); 
     Container content = frame.getContentPane(); 

     JTextArea jta = new JTextArea(); 
     jta.setFont(frame.getFont()); 
     content.add(jta); 

     jta.setText("\u16e6"); 

    } 
} 
+0

什么环境,你在运行(的Windows?),什么是JVM的字符编码?尝试[将'-Dfile.encoding = UTF-8'](http://stackoverflow.com/q/361975/113632)添加到'java'命令中,看看是否有帮助。 – dimo414

+0

'我已经将JTextArea的字体设置为与JFrame相同,' - JFrame的标题栏不是Swing组件,它是一个操作系统小部件。因此,操作系统使用的字体与框架的getFont()方法中返回的字体不同。我知道这并不能解决问题,只是说明字体不同,这就是文字区域无法渲染字符的原因。所以你需要找到一个呈现“\ u16e6”字符的字体。我不知道该怎么做。 – camickr

+0

@AndrewThompson为什么这是一个封闭问题的重复?这似乎是一个完全合理的问题。 – dimo414

回答

0

我已经设置了的JTextArea的字体是相同的JFrame, -

一个JFrame的标题栏不是Swing组件,它是OS的小部件。因此,操作系统使用的字体与框架的getFont()方法中返回的字体不同。因此,文本区域的字体不是您认为应该是的字体,这就是文字区域无法渲染字符的原因。

我不知道如何确定OS框架使用的字体是什么。即使我们可以确定,它也可能不适用于Swing。

所以你需要找到一个呈现“\ u16e6”字符的字体。下面的程序是一个蛮力方法来找到这样一个字体。它显示Swing可用的所有字体。所以我一次选择了Font,直到找到一个显示你的符号的字体。

import java.awt.*; 
import java.awt.event.*; 
import java.util.*; 
import javax.swing.*; 
import javax.swing.plaf.basic.*; 

public class ComboBoxFonts extends JFrame implements ItemListener 
{ 
    JTextArea textArea; 
    JComboBox comboBox; 

    public ComboBoxFonts() 
    { 
     Font font = new Font("Courier New", Font.PLAIN, 16); 

     GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
     Font [] fonts = ge.getAllFonts(); 

     comboBox = new JComboBox(fonts); 
     comboBox.setFont(font); 
     comboBox.addItemListener(this); 
     add(comboBox, BorderLayout.SOUTH); 

     textArea= new JTextArea("Some text - \u16e6 -", 3, 20); 
     textArea.setFont(font.deriveFont(24.0f)); 
     add(new JScrollPane(textArea)); 
    } 

    public void itemStateChanged(ItemEvent e) 
    { 
     Font font = (Font)e.getItem(); 
     textArea.setFont(font.deriveFont(24.0f)); 
    } 

    public static void main(String[] args) 
    { 
     ComboBoxFonts frame = new ComboBoxFonts(); 
     frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 

在我的Windows平台上唯一的字体显示为:

//jta.setFont(frame.getFont()); 
jta.setFont(new Font("Segoe UI Symbol", Font.PLAIN, 18));