JComboBox的自定义字体 [英] Custom Font for JComboBox
问题描述
我希望知道如何更改 JComboBox
中显示/选定值的字体。 EG
Aharoni
(图片由这个答案 $ b
我可以使用像这样的渲染器来更改列表值:
public class JComboBoxItalic extends BasicComboBoxRenderer {
protected DefaultListCellRenderer defaultRenderer = new DefaultListCellRenderer();
$ b公共组件getListCellRendererComponent(JList列表,对象值,int索引,布尔isSelected,布尔cellHasFocus){
Font theFont = null;
JLabel renderer =(JLabel)defaultRenderer.getListCellRendererComponent(list,value,index,isSelected,cellHasFocus);
theFont = new Font(Courier,Font.ITALIC,14);
renderer.setFont(theFont);
返回渲染器;
$ b但是这并不影响选定的值盒子关闭时。任何想法?
解决方案
我看不出什么错,问题一定是代码的其余部分
渲染器仅适用于(如果是可见的)弹出窗口中的Item,
你可以使用基本的和最简单的Renderer
你可以覆盖所有来自paraman的参数 - JList list,Object value,
int index,boolean isSelected,boolean 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;
$ / code $ / $ p
$编辑
我想知道如何在JComboBox中更改
显示/选择值的字体
。
。
$ b
。
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;
私人JComboBox fontsBox;
public SystemFontDisplayer(){
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
String [] fontFamilyNames = ge.getAvailableFontFamilyNames();
fontsBox = new JComboBox(fontFamilyNames);
fontsBox.setSelectedItem(0);
fontsBox.setRenderer(new ComboRenderer(fontsBox));
(new ItemListener(){
@Override
public void itemStateChanged 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(){
@覆盖
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;
$ b 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);
$覆盖$ b $公共组件getListCellRendererComponent(JList列表,对象值,int索引,布尔isSelected,布尔cellHasFocus){
super.getListCellRendererComponent(list,value,index,isSelected,cellHasFocus); $()b $ 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));
返回这个;
}
}
}
I would like that to know how to change the Font for the displayed/selected value in a JComboBox
. E.G.
The upper rendering of Aharoni
(image courtesy of this answer).
I can change the list values with a renderer like this:
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;
}
}
But this does not affect the selected value when the box is closed. Any ideas?
解决方案
I can't see something wrong, issue must be in the rest of your code
Renderer is applied only for Item in (if is visible) popup window,
you can to use the basic and simplest Renderer
you can to override all from paramaters from púaramaters - JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus, every are settable, testable ..., separatelly
.
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;
}
}
EDIT
I would like that to know how to change the Font for the
displayed/selected value in a 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;
}
}
}
这篇关于JComboBox的自定义字体的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!