【问题标题】:Unicode Support in JTextArea Component [duplicate]JTextArea 组件中的 Unicode 支持
【发布时间】:2016-08-06 11:20:11
【问题描述】:

我制作了这个简单的程序,我想在其中显示一个 JTextArea 中的 unicode 符文字符 \u16e6。该符号显示在 JFrame 的顶部,但不在 JTextArea 中。我已将 JTextArea 的字体设置为与 JFrame 相同,但它仍然只会将 \u16e6 显示为空框。如何在 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");

   }
}

【问题讨论】:

  • 您在什么环境下运行(Windows?),JVM 的字符编码是什么?尝试adding -Dfile.encoding=UTF-8 到您的java 命令,看看是否有帮助。
  • I have set the font of the JTextArea to be the same as the JFrame, - JFrame 的标题栏不是 Swing 组件,它是 OS 小部件。所以操作系统使用的字体和框架的getFont()方法返回的Font是不一样的。我知道这并不能解决问题,它只是说明字体不同,这就是文本区域无法呈现字符的原因。所以你需要找到一种能呈现“\u16e6”字符的字体。我不知道该怎么做。
  • @AndrewThompson 为什么这是一个封闭问题的副本?这似乎是一个非常合理的问题。
  • @dimo414 “为什么这是一个封闭问题的副本?..” 因为第一个答案给出了如何找到合适字体的完整示例。 “这似乎是一个完全合理的问题。” 没有 MCVE 或重复的票数接近并不意味着不合理。
  • @AndrewThompson,发布了一个 MCVE。关于重复,我在发布答案之前也进行了搜索,但没有找到您的答案。但你是对的,你的解决方案比我的要完整得多。您需要做的就是更改文本字符串以包含您要显示的 unicode 字符。至少用我的蛮力方法我想出了相同的答案:)

标签: java swing unicode fonts


【解决方案1】:

我已经将JTextArea的字体设置为和JFrame一样,-

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

我不知道如何确定操作系统框架使用的字体是什么。即使我们可以确定这一点,它也可能对 Swing 不可用。

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

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

【讨论】:

    猜你喜欢
    • 2012-12-23
    • 1970-01-01
    • 2012-09-16
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 2011-06-09
    相关资源
    最近更新 更多