JComboBox的自定义字体
问题描述:
我希望知道如何更改JComboBox
中显示/选定值的字体。例如。JComboBox的自定义字体
Aharoni
(的this answer图像提供)的上渲染。
我可以用这样的渲染器更改列表值:
public class JComboBoxItalic extends BasicComboBoxRenderer {
protected DefaultListCellRenderer defaultRenderer = new DefaultListCellRenderer();
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
Font theFont = null;
JLabel renderer = (JLabel) defaultRenderer.getListCellRendererComponent(list, value, index, isSelected,cellHasFocus);
theFont = new Font("Courier", Font.ITALIC, 14);
renderer.setFont(theFont);
return renderer;
}
}
但是,当对话框关闭这并不影响选择的值。有任何想法吗?
答
我看不出什么问题,问题必须在
渲染器仅针对项目中(如果是可见的)弹出窗口应用于您的代码的其余部分,
你可以使用基本和最简单的渲染器
你可以覆盖所有参数从puramarsters - JList列表,对象值, INT索引,布尔isSelected,布尔cellHasFocus,每个可设置,可测试...,单独
。
private class ComboBoxRenderer extends DefaultListCellRenderer {
private static final long serialVersionUID = 1L;
private Font baseFont = new JLabel("Test").getFont();
@Override
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
//if (value instanceof Font) {
// Font font = (Font) value;
// setFont(new Font(font.getName(), baseFont.getStyle(), baseFont.getSize()));
setFont(new Font("Courier", Font.ITALIC, 14));
//}
return this;
}
}
编辑
我想,要知道如何更改字体在一个JComboBox,
显示/选择值 。
。
。
。
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GraphicsEnvironment;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JViewport;
import javax.swing.plaf.basic.BasicComboBoxRenderer;
public class SystemFontDisplayer extends JFrame {
private static final long serialVersionUID = 1L;
private JComboBox fontsBox;
public SystemFontDisplayer() {
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
String[] fontFamilyNames = ge.getAvailableFontFamilyNames();
fontsBox = new JComboBox(fontFamilyNames);
fontsBox.setSelectedItem(0);
fontsBox.setRenderer(new ComboRenderer(fontsBox));
fontsBox.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
final String fontName = fontsBox.getSelectedItem().toString();
fontsBox.setFont(new Font(fontName, Font.PLAIN, 16));
}
}
});
fontsBox.setSelectedItem(0);
fontsBox.getEditor().selectAll();
add(fontsBox, BorderLayout.CENTER);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setPreferredSize(new Dimension(400, 60));
setLocation(200, 105);
pack();
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
fontsBox.setPopupVisible(true);
fontsBox.setPopupVisible(false);
}
});
setVisible(true);
}
public static void main(String arg[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
SystemFontDisplayer systemFontDisplayer = new SystemFontDisplayer();
}
});
}
private class ComboRenderer extends BasicComboBoxRenderer {
private static final long serialVersionUID = 1L;
private JComboBox comboBox;
final DefaultListCellRenderer defaultRenderer = new DefaultListCellRenderer();
private int row;
private ComboRenderer(JComboBox fontsBox) {
comboBox = fontsBox;
}
private void manItemInCombo() {
if (comboBox.getItemCount() > 0) {
final Object comp = comboBox.getUI().getAccessibleChild(comboBox, 0);
if ((comp instanceof JPopupMenu)) {
final JList list = new JList(comboBox.getModel());
final JPopupMenu popup = (JPopupMenu) comp;
final JScrollPane scrollPane = (JScrollPane) popup.getComponent(0);
final JViewport viewport = scrollPane.getViewport();
final Rectangle rect = popup.getVisibleRect();
final Point pt = viewport.getViewPosition();
row = list.locationToIndex(pt);
}
}
}
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
if (list.getModel().getSize() > 0) {
manItemInCombo();
}
final JLabel renderer = (JLabel) defaultRenderer.getListCellRendererComponent(list, value, row, isSelected, cellHasFocus);
final Object fntObj = value;
final String fontFamilyName = (String) fntObj;
setFont(new Font(fontFamilyName, Font.PLAIN, 16));
return this;
}
}
}
使用Html代替操纵字体类型和大小..只是一个sugegstion。 – ErrorNotFoundException 2013-05-09 12:12:32
@Stanley *“只是一个sugegstion”*不是一个很好的。通过将HTML字符串作为值,而不是像'Apple'那样获取值,我们得到'
Apple' - 对API的可怕滥用。 – 2013-05-09 12:13:15如果每个元素都包含“如何显示”变量,那么为什么不简单地改变这些“如何显示”变量? – Infested 2013-05-09 12:17:27