Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unicode特殊字符出现在Java控制台中,但不在Swing中_Java_Swing_Unicode_Fonts - Fatal编程技术网

Unicode特殊字符出现在Java控制台中,但不在Swing中

Unicode特殊字符出现在Java控制台中,但不在Swing中,java,swing,unicode,fonts,Java,Swing,Unicode,Fonts,我试图在JFrame内部的JLabel中添加一些高范围的unicode字符,但它们仅显示为方框,尽管使用了已知的受支持字体。然而,当我将这些相同的字符打印到Eclipse控制台时,它们显示得很好。这是我的代码,“frame”是我的JFrame,“textField1”是我的JLabel。Monaco字体与Eclipse控制台使用的字体相同,并且已知支持此unicode字符: JFrame frame = new JFrame(); JLabel textField1 = new JLabel()

我试图在JFrame内部的JLabel中添加一些高范围的unicode字符,但它们仅显示为方框,尽管使用了已知的受支持字体。然而,当我将这些相同的字符打印到Eclipse控制台时,它们显示得很好。这是我的代码,“frame”是我的JFrame,“textField1”是我的JLabel。Monaco字体与Eclipse控制台使用的字体相同,并且已知支持此unicode字符:

JFrame frame = new JFrame();
JLabel textField1 = new JLabel();
frame.add(textField1);
frame.setFocusable(true);
frame.setLayout(new BoxLayout(getContentPane(), BoxLayout.PAGE_AXIS));
frame.setPreferredSize(new Dimension(1000, 500));
frame.requestFocusInWindow();
frame.textField1.setFont(new Font("Monaco", Font.PLAIN, 11 ));
frame.textField1.setText("\uD83C\uDF2D"); 
frame.pack();
frame.setVisible(true);
我曾尝试将JLabel设置为许多不同的字体,但所做的更改只是“缺少字符”框的相对形状。但是,如果我打印这个:

System.out.println("\uD83C\uDF2D");
角色在控制台中按预期打印。是否有一些编码问题阻止这些符号在Swing中工作

第一件事

1) Moncaco字体不支持
\uD83C\uDF2D

2) 您可以在以下位置检查支持此字符的字体:

3) 支持的字体似乎适用于此字符,其中列出了:
LastResport、Symbola和Unifont Upper
。看

现在您如何在Java中支持它?下载,将其设置为label并按如下所示使用

import java.awt.Dimension;
import java.awt.Font;
import java.io.File;
import java.net.URI;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.WindowConstants;

public class FrameMain1 {

    public static void main(String[] args) throws Exception {

        File fontFile = new File(new URI("file:///D:/tmp/Symbola.ttf"));
        Font font = Font.createFont(Font.TRUETYPE_FONT, fontFile);
        font = font.deriveFont(Font.PLAIN, 24f);
        JFrame frame = new JFrame();
        JLabel label1 = new JLabel("\uD83C\uDF2D");
        frame.setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.PAGE_AXIS));
        frame.add(label1);
        frame.setFocusable(true);
        //frame.setPreferredSize(new Dimension(1000, 500));
        frame.requestFocusInWindow();
        label1.setFont(font);
        frame.add(label1);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }

}

Font.canDisplayUpTo(String)方法是您在这里的朋友。这就是如何使用它来创建支持文本的字体组合

        String[] fonts = GraphicsEnvironment.getLocalGraphicsEnvironment().
                getAvailableFontFamilyNames();
        System.out.println(fonts.length + " font families installed");
        Vector<String> supportedFonts = new Vector<>();
        for (String fontName : fonts) {
            Font f = new Font(fontName, Font.PLAIN, 1);
            if (f.canDisplayUpTo(text)<0) {
                System.out.println(fontName);
                supportedFonts.add(fontName);
            }
        }
        fontComboBox = new JComboBox(supportedFonts);
这是生成上述输出的源代码,并显示一个GUI,允许用户在支持给定Unicode字符的所有字体之间进行选择:

import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
导入javax.swing.border.EmptyBorder;
导入java.util.Vector;
公共类字体检查{
私有JComponent ui=null;
私有最终字符串text=“\uD83C\uDF2D”;
私有JComboBox-fontComboBox;
私有JTextField outputField=新的JTextField(文本,5);
FontCheck(){
initUI();
}
public void initUI(){
如果(ui!=null)返回;
ui=新JPanel(新边界布局(4,4));
ui.新订单(新的空订单(4,4,4,4));
ui.add(outputField);
添加(getToolBar(),BorderLayout.PAGE_START);
刷新字体();
}
私有JToolBar getToolBar(){
JToolBar tb=新的JToolBar();
tb.setLayout(新的FlowLayout());
String[]fonts=GraphicsEnvironment.getLocalGraphicsEnvironment()。
getAvailableFontFamilyNames();
System.out.println(font.length+“已安装字体系列”);
Vector supportedFonts=新矢量();
用于(字符串字体名称:字体){
Font f=新字体(fontName,Font.PLAIN,1);

如果(f.canDisplayUpTo)(文本)最常见的原因是字体不支持显示characters@MadProgrammer是的,但正如我所说的,我100%确信这种字体支持这个字符,我查了一下,加上它与我所说的控制台的字体相同,可以完美地显示它。我还尝试了多种其他已知的支持这个字符的字体,但都没有用。我是这样做的我不相信摩纳哥字体有这样的功能。有没有办法确定它正在切换到什么字体?我无法知道这个系统上的哪些字体支持它。我同意@Andreas,并根据它添加了我的答案。如果我没有安装这些字体,我会得到NPE:EventQueue-0“test.FontCheck.refreshFont(FontCheck.java:70)在test.FontCheck.initUI(FontCheck.java:37)在test.FontCheck.(FontCheck.java:23)上的java.lang.NullPointerException”`“以防万一,如果我没有安装这些fon,这很重要”理解代码很重要,它不包括卸载的字体,也不会抛出一个NPE,其源代码如上所示。如何安装一个新的不受支持的字体?这不是很重要吗@andrew thompson?不过,一点应用程序也可以解决OP的问题。@Optional“如何安装新的不受支持的字体?”请参阅。“这不是很重要吗…”是否重要不是问题。这个问题是关于失败是否是编码问题。谢谢,这非常有帮助并解决了问题。
225 font families installed
Segoe UI Emoji
Segoe UI Symbol
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.util.Vector;

public class FontCheck {

    private JComponent ui = null;

    private final String text = "\uD83C\uDF2D"; 
    private JComboBox fontComboBox;
    private JTextField outputField = new JTextField(text, 5);

    FontCheck() {
        initUI();
    }

    public void initUI() {
        if (ui!=null) return;

        ui = new JPanel(new BorderLayout(4,4));
        ui.setBorder(new EmptyBorder(4,4,4,4));

        ui.add(outputField);
        ui.add(getToolBar(), BorderLayout.PAGE_START);

        refreshFont();
    }

    private JToolBar getToolBar() {
        JToolBar tb = new JToolBar();
        tb.setLayout(new FlowLayout());

        String[] fonts = GraphicsEnvironment.getLocalGraphicsEnvironment().
                getAvailableFontFamilyNames();
        System.out.println(fonts.length + " font families installed");
        Vector<String> supportedFonts = new Vector<>();
        for (String fontName : fonts) {
            Font f = new Font(fontName, Font.PLAIN, 1);
            if (f.canDisplayUpTo(text)<0) {
                System.out.println(fontName);
                supportedFonts.add(fontName);
            }
        }
        fontComboBox = new JComboBox(supportedFonts);
        ActionListener refreshListener = new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                refreshFont();
            }
        };
        fontComboBox.addActionListener(refreshListener);

        tb.add(fontComboBox);
        return tb;
    }

    private void refreshFont() {
        String fontName = fontComboBox.getSelectedItem().toString();
        Font f = new Font(fontName, Font.PLAIN, 60);
        outputField.setFont(f);
    }

    public JComponent getUI() {
        return ui;
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception useDefault) {
                }
                FontCheck o = new FontCheck();

                JFrame f = new JFrame(o.getClass().getSimpleName());
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                f.setLocationByPlatform(true);

                f.setContentPane(o.getUI());
                f.pack();
                f.setMinimumSize(f.getSize());

                f.setVisible(true);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}