2009-10-15 8 views
2

Je voudrais faire un JComboBox qui a des cases à cocher pour les éléments au lieu de texte. En outre, il devrait être possible de vérifier plusieurs éléments et d'extraire les éléments sélectionnés du composant. Dois-je créer un ComboBoxUI, ComboBoxEditor, ListCellRenderer, ComboPopUp personnalisé ou quelque chose de complètement différent? Existe-t-il un contrôle Java existant?Java - cases à cocher dans un JComboBox

Répondre

5

Cela a été assez facile à mettre en œuvre. Trouvé ici 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

Je ne peux pas imaginer que quelqu'un souhaite modifier la case à cocher sélectionnée avec comboModel – kleopatra

+0

J'ai utilisé votre exemple pour créer un exemple et je n'ai pas pu sélectionner de données à partir de la liste déroulante. par exemple. si le texte combo est Premier, deuxième, etc. \t Appuyez sur la touche "S" de l'utilisateur, \t La deuxième doit être en surbrillance/sélectionnée. Tout comme dans JComboBox normal. \t Y at-il un moyen de le faire comme dans l'une de mes applications, nous en avons besoin. – sridhar

1

Ce n'est pas ce que les boîtes combo sont "pour". Êtes-vous sûr de ne pas vouloir, disons, un JMenu avec JRadioButtonMenuItem s?

Si voulez voulez vraiment continuer, alors vous utiliseriez un moteur de rendu personnalisé, comme vous suggested.

1

On nous a déjà donné cette même exigence innée. Nous nous sommes conformés à un tout nouveau composant. C'était essentiellement un JPanel qui avait un champ de texte et un bouton fléché vers le bas. Il contenait un JList qui utilisait un JCheckbox -derrived ListCellRenderer. Le JList a été empaqueté dans un JPopupMenu qui a été affiché sur des clics de souris.

0

Vous pouvez jeter un oeil à japura. C'est un composant personnalisé open source basé sur swing.