1

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

证明:

证明

所有与 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
    }
}
4

3 回答 3

4

不要“更改”字体,这可能会导致您使用不兼容的字体,而是尝试简单地更改标签的“默认”字体大小

在此处输入图像描述

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

}
于 2013-09-12T00:11:44.087 回答
2

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

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

于 2013-09-12T00:51:57.317 回答
0

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

于 2017-10-08T15:16:40.267 回答