【问题标题】:How to make unique font color for lines in a JCombobox?如何为 JCombobox 中的线条制作独特的字体颜色?
【发布时间】:2009-06-01 15:22:39
【问题描述】:

我想为 JCombobox 中的行/条目设置字体颜色,每行都是唯一的。所以基本上当你点击下拉箭头时,你应该会看到几行不同的颜色,我想根据它们的属性自己指定颜色。我该怎么做呢?谢谢!

【问题讨论】:

    标签: java swing jcombobox


    【解决方案1】:

    您需要像这样创建一个自定义 ListCellRenderer:

    class Renderer extends JLabel implements ListCellRenderer {
    

    并实现这个方法:

    public Component getListCellRendererComponent(JList list, Object value,
                int index, boolean isSelected, boolean cellHasFocus) {
            // Get the selected index. (The index param isn't
            // always valid, so just use the value.)
    
            if (isSelected) {
                setBackground(list.getSelectionBackground());
                setForeground(list.getSelectionForeground());
            } else {
                setBackground(list.getBackground());
                setForeground(list.getForeground());
            }
    
            // Display the text
            String text = (String) value;
            setText(text);
    
            // Get the source
    

    然后,根据您的来源,使用 this.setForeground(Color color) 设置文本的颜色。最后,

    return this;
    

    }

    【讨论】:

      【解决方案2】:

      您可能必须为您的 JComboBox 提供自定义渲染器,请在此处查看 Sun 的教程:

      http://java.sun.com/docs/books/tutorial/uiswing/components/combobox.html#renderer

      (抱歉没有链接,因为我是新会员,所以还不能发链接)

      【讨论】:

        【解决方案3】:

        您可以使用ListCellRenderer。您需要为此编写自定义类。这是基于索引设置前景的完整代码(以避免重复)。您还可以为此设置自定义选择背景和背景。查看代码中的 cmets。

        import javax.swing.*;
        import java.awt.*;
        import java.awt.event.*;
        import java.util.*;
        class ListCellRendererDemo2 extends JFrame
        {
        Hashtable<Integer,Color> table;
        JComboBox<String> c;
        
            public ListCellRendererDemo2()
            {
                createAndShowGUI();
            }
        
            private void createAndShowGUI()
            {
                setTitle("JComboBox Demo");
                setLayout(new FlowLayout());
                setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
                table=new Hashtable<Integer,Color>();
                table.put(1,Color.RED);
                table.put(2,Color.BLUE);
                table.put(3,Color.GREEN);
                table.put(4,Color.GRAY);
        
        
                c=new JComboBox<String>();
                c.addItem("Item 1");
                c.addItem("Item 2");
                c.addItem("Item 3");
                c.addItem("Item 4");
                c.addItem("Item 5");
                c.addItem("Item 6");
                c.addItem("Item 7");
                c.addItem("Item 8");
        
                c.setRenderer(new MyListCellRenderer(table));
        
                add(c);
                setSize(400,400);
                setVisible(true);
            }
        
            public static void main(String args[])
            {
                SwingUtilities.invokeLater(new Runnable(){
                    public void run()
                    {
                        new ListCellRendererDemo2();
                    }
                });
            }
        }
        class MyListCellRenderer extends DefaultListCellRenderer
        {
        Hashtable<Integer,Color> table;
        
            public MyListCellRenderer(Hashtable<Integer,Color> table)
            {
                this.table=table;
        
                // Set opaque for the background to be visible
                setOpaque(true);
            }
        
            public Component getListCellRendererComponent(JList jc,Object val,int idx,boolean isSelected,boolean cellHasFocus)
            {
                // Set text (mandatory)
                setText(val.toString());
        
                // Set the foreground according to the selected index
                setForeground(table.get(idx));
        
                    // Set your custom selection background, background
                    // Or you can get them as parameters as you got the table
                    if(isSelected) setBackground(Color.LIGHT_GRAY);
                    else setBackground(Color.WHITE);
        
            return this;
            }
        }
        

        【讨论】:

        • 请问有没有更旧的线程,为什么要转世任何僵尸,+1 初始线程:-)
        猜你喜欢
        • 2021-11-23
        • 2021-05-17
        • 2021-09-19
        • 2020-04-16
        • 1970-01-01
        • 2014-08-21
        • 1970-01-01
        • 1970-01-01
        • 2016-06-22
        相关资源
        最近更新 更多