Search code examples
javaswingjcheckbox

Select all JCheckBox in JComboBox


I have JCheckBox in JComboBox code :

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class CheckCombo implements ActionListener
{
    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));
    }

    private JPanel getContent()
    {
        String[] ids = { "north", "west", "south", "east", "ALL" };
        Boolean[] values =
        {
            Boolean.TRUE, Boolean.FALSE, Boolean.FALSE, Boolean.FALSE, Boolean.FALSE
        };
        CheckComboStore[] stores = new CheckComboStore[ids.length];
        for(int j = 0; j < ids.length; j++)
            stores[j] = new CheckComboStore(ids[j], values[j]);
        JComboBox combo = new JComboBox(stores);
        combo.setRenderer(new CheckComboRenderer());
        combo.addActionListener(this);
        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 CheckCombo().getContent());
        f.setSize(300,160);
        f.setLocation(200,200);
        f.setVisible(true);
    }
}

/** adapted from comment section of ListCellRenderer api */
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.id);
        checkBox.setSelected(((Boolean)store.state).booleanValue());
        checkBox.setBackground(isSelected ? Color.red : Color.white);
        checkBox.setForeground(isSelected ? Color.white : Color.black);
        return checkBox;
    }
}

class CheckComboStore
{
    String id;
    Boolean state;

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

How can I check all box after check ALL and 'de'check(false)


Solution

  • When you select "ALL" you have all selected, when you deselect "ALL" you have all deselected. Try out and play with it.

    public class CheckCombo implements ActionListener {
    
        JComboBox combo = null;
    
        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));
            if (store.id.equals("ALL")){
                for (int i = 0; i < combo.getItemCount(); i++){
                    ((CheckComboStore)combo.getItemAt(i)).state = ccr.checkBox.isSelected();
                }
            }
        }
    
        private JPanel getContent() {
    
            String[] ids = { "north", "west", "south", "east", "ALL" };
            Boolean[] values = { Boolean.TRUE, Boolean.FALSE, Boolean.FALSE, Boolean.FALSE, Boolean.FALSE };
            CheckComboStore[] stores = new CheckComboStore[ids.length];
            for (int j = 0; j < ids.length; j++)
                stores[j] = new CheckComboStore(ids[j], values[j]);
            combo = new JComboBox(stores);
            combo.setRenderer(new CheckComboRenderer());
            combo.addActionListener(this);
            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 CheckCombo().getContent());
            f.setSize(300, 160);
            f.setLocation(200, 200);
            f.setVisible(true);
        }
    }
    
    /** adapted from comment section of ListCellRenderer api */
    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.id);
            checkBox.setSelected(((Boolean) store.state).booleanValue());
            checkBox.setBackground(isSelected ? Color.red : Color.white);
            checkBox.setForeground(isSelected ? Color.white : Color.black);
            return checkBox;
        }
    }
    
    class CheckComboStore {
    
        String id;
        Boolean state;
    
        public CheckComboStore(String id, Boolean state) {
    
            this.id = id;
            this.state = state;
        }
    }