Java JComboBox中字体呈现不正确

Java JComboBox中字体呈现不正确,java,fonts,jcombobox,Java,Fonts,Jcombobox,我正在尝试制作一个JComboBox,它显示Java中所有可用的字体,并以各自的字体显示这些字体的名称。该列表似乎在大部分情况下都有效,但有相当多的字体要么呈现为巨大的空白,要么所有字母堆叠在一起: 这是我的代码中的一个问题,还是OS/Java(Windows8,JDK1.7.055)的问题 import javax.swing.*; 导入java.awt.*; 导入java.awt.event.ItemEvent; 导入java.awt.event.ItemListener; 导入java.

我正在尝试制作一个JComboBox,它显示Java中所有可用的字体,并以各自的字体显示这些字体的名称。该列表似乎在大部分情况下都有效,但有相当多的字体要么呈现为巨大的空白,要么所有字母堆叠在一起:

这是我的代码中的一个问题,还是OS/Java(Windows8,JDK1.7.055)的问题

import javax.swing.*;
导入java.awt.*;
导入java.awt.event.ItemEvent;
导入java.awt.event.ItemListener;
导入java.io.*;
公共类TextEditor扩展了JFrame{
私有静态JPanel j;
私有静态字符串[]fontNames=GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
公共文本编辑器(){
设置大小(500500);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setContentPane(j);
设置DefaultLookandFeelDecorated(true);
setTitle(“文本编辑器”);
setVisible(真);
}
公共静态void main(字符串[]args)引发FileNotFoundException{
初始化组件(“Sampe文本”);
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
TextEditor edit=新建TextEditor();
}
});
}
公共静态组件(字符串){
j=新的JPanel();
j、 setLayout(新的BorderLayout());
最终JComboBox字体=新JComboBox(字体名称);
setRenderer(新的ListRenderer());
fonts.addItemListener(新的ItemListener(){
@凌驾
公共无效itemStateChanged(ItemEvent e){
最后一个字符串font=fonts.getSelectedItem().toString();
fonts.setFont(新字体(Font,Font.PLAIN,16));
}
});
fonts.setPrototypeDisplayValue(“XXXXXXXXXXXXX”);
j、 添加(字体,BorderLayout.NORTH);
}
私有静态类ListRenderer扩展了DefaultListCellRenderer{
@凌驾
公共组件getListCellRenderComponent(JList列表、对象值、int索引、布尔isSelected、布尔cellHasFocus){
getListCellRenderComponent(列表、值、索引、isSelected、cellHasFocus);
字符串selectedIndex=(字符串)值;
setFont(新字体(selectedIndex,Font.PLAIN,16));
setText(selectedIndex);
归还这个;
}
}
}

我得到一对显示为黑色矩形的夫妇,但没有一对是改写的。我在Windows7上使用JDK7。发布演示问题的文章,以便其他人可以在不同版本/平台上测试代码,看看他们是否仍然存在相同的问题。添加了SSCCE。奇怪的是,它的呈现方式对你来说不一样,也许它确实与操作系统有关?在论坛上发布代码。完成了,很抱歉。除了我最初的评论,我还应该提到我没有收到任何空行,因此可能是平台的不同。
import javax.swing.*;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.*;

public class TextEditor extends JFrame{

    private static JPanel j;
    private static String[] fontNames =     GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
    public TextEditor(){
        setSize(500, 500);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setContentPane(j);
        setDefaultLookAndFeelDecorated(true);
        setTitle("Text Editor");
        setVisible(true);
    }

    public static void main(String[] args) throws FileNotFoundException {
        initComponents("Sampe Text");
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                TextEditor edit = new TextEditor();
            }
        });
    }

    public static void initComponents(String s){
        j = new JPanel();
        j.setLayout(new BorderLayout());

        final JComboBox<String> fonts = new JComboBox<String>(fontNames);
        fonts.setRenderer(new ListRenderer());
        fonts.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                final String font = fonts.getSelectedItem().toString();
                fonts.setFont(new Font(font, Font.PLAIN, 16));
            }
        });
        fonts.setPrototypeDisplayValue("XXXXXXXXXXXXXX");

        j.add(fonts, BorderLayout.NORTH);
    }

    private static class ListRenderer extends DefaultListCellRenderer {
        @Override
        public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus){
            super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);

            String selectedIndex = (String) value;
            setFont(new Font(selectedIndex, Font.PLAIN, 16));
            setText(selectedIndex);
            return this;
        }
    }
}