swing - 自定义JCombobox默认选择背景色不可见

标签 swing model jcombobox java

我已经创建了扩展 JCombobox 的自定义组合框。它在弹出列表中有复选框。当我尝试在弹出窗口中选择/选中复选框时,没有选择颜色。

我试图将背景设置为自定义渲染器中的复选框,但它不起作用。如果有任何想法请帮助,这是我的代码。提前致谢。

import java.awt.*;   
import java.awt.event.*;   
import java.util.ArrayList;

import javax.swing.*;   

public class MyCombo extends JComboBox implements ActionListener  
{ 
    /**
     * Serial version uid
     */
    private static final long serialVersionUID = 1L;

    /**
     * Renderer for CheckBoxListComboBox
     */
    protected CheckComboRenderer renderer;

    /**
     * Editor for CheckBoxListComboBox
     */
    protected ComboEditor editor;

    /**
     * String Buffer that holds currently selected values
     */
    protected StringBuffer selectedValues;

    /**
     * Creates a <code>CheckBoxListComboBox</code> that contains the elements
     * in the specified arrayList.  By default no item becomes selected.
     * @param arrayList ArrayList holds data to display
     */
    public MyCombo()
    {
        renderer = new CheckComboRenderer();
        editor = new ComboEditor();
        selectedValues = new StringBuffer();
        setEditable(true);
        setModel(makeModel());

        addActionListener(this);
        setRenderer(renderer);   
        setEditor(editor);
    }

    /* (non-Javadoc)
     * @see javax.swing.JComboBox#setPopupVisible(boolean)
     */
    public void setPopupVisible(boolean v) 
    {
        //Dont hide popup on click
        //super.setPopupVisible(v);
    }

    /* (non-Javadoc)
     * @see javax.swing.JComboBox#actionPerformed(java.awt.event.ActionEvent)
     */
    public void actionPerformed(ActionEvent e)
    {
        JComboBox cb = (JComboBox)e.getSource();   
        CheckComboStore store = (CheckComboStore)cb.getSelectedItem();   
        CheckComboRenderer ccr = (CheckComboRenderer)cb.getRenderer();   
        ccr.checkBox.setSelected((store.state = !store.state));   
        JTextField tf = (JTextField) editor.getEditorComponent();

        StringBuffer buffer = new StringBuffer("");
        DefaultComboBoxModel mdl = (DefaultComboBoxModel) cb.getModel();
        for (int i = 0; i < mdl.getSize(); i++)
        {
            store = (CheckComboStore)mdl.getElementAt(i);

            if (store.getState().booleanValue())
            {
                if (buffer.length() == 0)
                    buffer.append(store.getId());
                else
                    buffer.append("; " + store.getId());
            }
        }
        tf.setText(buffer.toString());
    }

    private DefaultComboBoxModel makeModel()
    {
        DefaultComboBoxModel model = new DefaultComboBoxModel();
        model.addElement(new CheckComboStore("Item1", false));
        model.addElement(new CheckComboStore("Item2", false));
        model.addElement(new CheckComboStore("Item3", false));
        model.addElement(new CheckComboStore("Item4", false));
        model.addElement(new CheckComboStore("Item5", false));
        return model;
    }

    private JPanel getContent()   
    {   
        final JComboBox combo = new JComboBox()
        {
            public void setPopupVisible(boolean v) 
            {
                //Dont hide popup on click
                //super.setPopupVisible(v);
            }
        };
        combo.setPreferredSize(new Dimension(250,25));
        combo.setEditable(true);
        combo.setModel(makeModel());

        combo.addActionListener(this);
        combo.setRenderer(renderer);   
        combo.setEditor(editor);
        JPanel panel = new JPanel(); 
        panel.add(combo);   
        return panel;   
    }   

    public static void main(String[] args)   
    {   
        JFrame f = new JFrame();   
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   
        f.getContentPane().add(new MyCombo().getContent());   
        f.setSize(300,160);   
        f.setLocation(200,200);   
        f.setVisible(true);   
    }

    class CheckComboRenderer implements ListCellRenderer   
    {   
        JCheckBox checkBox; 
        public CheckComboRenderer()   
        {   
            checkBox = new JCheckBox(); 
        }   

        public Component getListCellRendererComponent(JList list,   
                                                      Object value,   
                                                      int index,   
                                                      boolean isSelected,   
                                                      boolean cellHasFocus)   
        {
            CheckComboStore store = (CheckComboStore)value;   
            checkBox.setText(store.getId());  
            checkBox.setSelected(((Boolean)store.state).booleanValue());   
            checkBox.setBackground(isSelected ? Color.red : Color.white);   
            return checkBox;
        }   
    }

    class ComboEditor implements ComboBoxEditor 
    {   
        JTextField tf;   

        public ComboEditor() 
        {   
            tf = new JTextField(""); 
        }   

        public void addActionListener( ActionListener l ) {}   

        public void addKeyListener( KeyListener k){} 

        public Component getEditorComponent() 
        {   
            return tf;                                   
        }   

        public Object getItem() 
        {   
            return tf.getText();   
        }   

        public void removeActionListener( ActionListener l ) {}   

        public void selectAll() {}   

        public void setItem( Object o ) {}   
    }  

    class CheckComboStore   
    {   
        String id = "";   
        Boolean state = false;
        public String toString()
        {
            return id;
        }

        public CheckComboStore(String id, Boolean state)   
        {   
            this.id = id;   
            this.state = state;   
        } 

        public String getId()
        {
            return id;
        }

        public Boolean getState()
        {
            return state;
        }
    }  
}   

最佳答案

从 DefaultCellRenderer 源码看

    bg = DefaultLookup.getColor(this, ui, "List.dropCellBackground");
    fg = DefaultLookup.getColor(this, ui, "List.dropCellForeground");

if (isSelected) {
    setBackground(bg == null ? list.getSelectionBackground() : bg);
    setForeground(fg == null ? list.getSelectionForeground() : fg);
}
else {
    setBackground(list.getBackground());
    setForeground(list.getForeground());
}

关于swing - 自定义JCombobox默认选择背景色不可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6844253/

相关文章:

java - 如何在其他弹出窗口上显示弹出窗口?

java - 左键点击弹出

java - java中的文件读取

mysql - 为什么 Rails 模型不将值写入数据库?

java - 如何从 JComboBox 中的选定项目中获取包含 2 个项目的数组?

java - 如何在 GridLayout (java swing) 中定义/排列按钮位置?

unity-game-engine - Unity3D : How to make a glowing gradient sphere?

php - 将商品和子商品插入订单

java - 如何在JComboBox中显示信息,但为后端操作选择不同的信息

java - 将 JComboBoxes 值保存到文本文件