Java JComboBox中字体呈现不正确
我正在尝试制作一个JComboBox,它显示Java中所有可用的字体,并以各自的字体显示这些字体的名称。该列表似乎在大部分情况下都有效,但有相当多的字体要么呈现为巨大的空白,要么所有字母堆叠在一起: 这是我的代码中的一个问题,还是OS/Java(Windows8,JDK1.7.055)的问题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.
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;
}
}
}