javax.swing中的Unicode字符仅在使用默认字体大小时显示

时间:2013-09-11 23:24:21

标签: java swing unicode fonts

我正在尝试在jLabel中显示一些Unicode字符。例如,“华氏度”字符(℉或“\ u2109”)。仅当我使用默认字体大小时才会显示此字符,该字体大小恰好为11.当我更改字体大小时,字符将替换为空方格。我尝试了几种不同的大小和几种不同的fonts,据说可以支持各种各样的unicode字符。谁能告诉我为什么Swing只在特定的字体大小下显示这个unicode字符?

证明:

Proof

与UI相关的所有代码都是由NetBeans使用设计器自动生成的,但以下是我如何向jLabel提供文本:

private void btnConvertActionPerformed(java.awt.event.ActionEvent evt) {                                           
    if(optToFarenheit.isSelected())
    {
        int tempFahr = (int)((Double.parseDouble(txtInput.getText()))
                * 1.8 + 32);
        lblResult.setText(tempFahr + " ℉");
        //lblResult.setText(tempFahr + " \u2109"); <-- Tried this too
    }
}

3 个答案:

答案 0 :(得分:3)

而不是“更改”字体,这可能会导致您使用不兼容的字体,只需更改标签的“默认”字体大小

enter image description here

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestUnicodeFont {

    public static void main(String[] args) {
        new TestUnicodeFont();
    }

    public TestUnicodeFont() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            JLabel normal = new JLabel("Normal - ?");
            JLabel byCode = new JLabel("Normal code - \u2109");

            JLabel normalLarger = new JLabel("Large - ?");
            normalLarger.setFont(normalLarger.getFont().deriveFont(48f));
            JLabel byCodeLatger = new JLabel("Large code - \u2109");
            byCodeLatger.setFont(byCodeLatger.getFont().deriveFont(48f));

            add(normal, gbc);
            add(byCode, gbc);
            add(normalLarger, gbc);
            add(byCodeLatger, gbc);
        }
    }

}

答案 1 :(得分:2)

在为您的组件更改Netbeans中的字体时,在字体对话框“从默认字体中导出字体”中有一个复选框,请确保选中它并且它应该可以正常工作。

或者您必须确保新字体支持unicode字符。例如,“Arial Unicode MS”也应该可以正常工作(在维基页面上提到)/

答案 2 :(得分:0)

我使用NetBeans编辑器中标签文本中的符号解决了类似的问题,首先使用Word中的符号生成文本,然后将其复制到标签的文本字段中。