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

Unicode characters in javax.swing only display when using the default font-size

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

证明:

Proof

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

1
2
3
4
5
6
7
8
9
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
    }
}


代替"更改"字体(这可能会导致您使用不兼容的字体),请尝试简单地更改标签的"默认"字体的大小

enter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
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);
        }
    }

}


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

或者您必须确保新字体确实支持Unicode字符。例如," Arial Unicode MS"也应该可以正常工作(在您的Wiki页面上已提及)/


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