2009-10-15 5 views
2

Я хотел бы сделать JComboBox, который имеет флажки для элементов вместо текста. Кроме того, должно быть возможно проверять несколько элементов и извлекать выбранные элементы из компонента. Должен ли я создавать пользовательские ComboBoxUI, ComboBoxEditor, ListCellRenderer, ComboPopUp или что-то другое? Есть ли существующий элемент управления Java, который делает это?Java - флажки в JComboBox

ответ

5

Это было довольно легко реализовать. Нашел здесь link text

/* * The following code is adapted from Java Forums - JCheckBox in JComboBox URL: http://forum.java.sun.com/thread.jspa?forumID=257&threadID=364705 Date of Access: July 28 2005 */ 
import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.table.*; 
import java.util.*; 

public class JComboCheckBox extends JComboBox { 
    public JComboCheckBox() { addStuff(); } 
    public JComboCheckBox(JCheckBox[] items) { super(items); addStuff(); } 
    public JComboCheckBox(Vector items) { super(items); addStuff(); } 
    public JComboCheckBox(ComboBoxModel aModel) { super(aModel); addStuff(); } 
    private void addStuff() { 
    setRenderer(new ComboBoxRenderer()); 
    addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent ae) { itemSelected(); } 
    }); 
    } 
    private void itemSelected() { 
    if (getSelectedItem() instanceof JCheckBox) { 
     JCheckBox jcb = (JCheckBox)getSelectedItem(); 
     jcb.setSelected(!jcb.isSelected()); 
    } 
    } 
    class ComboBoxRenderer implements ListCellRenderer { 
    private JLabel defaultLabel; 
    public ComboBoxRenderer() { setOpaque(true); } 
    public Component getListCellRendererComponent(JList list, Object value, int index, 
       boolean isSelected, boolean cellHasFocus) { 
     if (value instanceof Component) { 
     Component c = (Component)value; 
     if (isSelected) { 
      c.setBackground(list.getSelectionBackground()); 
      c.setForeground(list.getSelectionForeground()); 
     } else { 
      c.setBackground(list.getBackground()); 
      c.setForeground(list.getForeground()); 
     } 
     return c; 
     } else { 
     if (defaultLabel==null) defaultLabel = new JLabel(value.toString()); 
     else defaultLabel.setText(value.toString()); 
     return defaultLabel; 
     } 
    } 
    } 
} 
+0

не может представить, что кто-то хочет изменить флажок, выбранный вместе с comboModel selected – kleopatra

+0

Я использовал ваш пример для создания образца и получил, что мы не можем выбрать данные из раскрывающегося списка при нажатии клавиши. , например. если комбинированный текст - первый, второй и т. д. \t Пользователь нажимает клавишу «S», \t Второй должен быть выделен/выбран. Как в обычном JComboBox. \t Есть ли способ сделать это, как в одном из моих приложений, нам это нужно. – sridhar

1

Это не те комбо-боксы, которые «за». Вы уверены, что не хотите, скажем, JMenu с JRadioButtonMenuItem?

Если вы do действительно хотите продолжить, тогда вы будете использовать собственный рендерер, как вы, suggested.

1

Мы как-то получили такое же самое требование. Мы выполнили совершенно новый компонент. Это был по существу JPanel который имел текстовое поле и кнопку со стрелкой вниз. Он содержал JList, в котором использовался JCheckbox -полученный ListCellRenderer. JList был упакован в JPopupMenu , который отображался щелчками мыши.

0

Вы посмотрите на japura может. Это пользовательский компонент с открытым исходным кодом, основанный на качелях.