JComboBox的自定义字体 [英] Custom Font for JComboBox

查看:287
本文介绍了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屋!

  • 查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆