2011-07-27 6 views
1

J'ai créé une liste déroulante personnalisée qui étend JCombobox. C'est avoir des cases à cocher dans la liste déroulante. Lorsque j'essaie de sélectionner/cocher la case à cocher dans la fenêtre contextuelle, il n'y a pas de couleur de sélection.La couleur de fond de la sélection par défaut JCombobox par défaut n'est pas visible

J'ai essayé de définir l'arrière-plan de la case à cocher dans le moteur de rendu personnalisé, mais cela ne fonctionne pas. Voici mon code si des idées s'il vous plaît aider. Merci d'avance.

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; 
     } 
    } 
} 

Répondre

3

Voir la source de 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()); 
} 
+0

Je ne suis pas capable de l'utiliser donne Restriction d'accès: Le type DefaultLookup n'est pas accessible en raison de la restriction sur la bibliothèque requise. – u449355

+1

Je pense que vous ne laisserez rien tomber dans le combo. Donc, vous pouvez utiliser list.getSelectionBackground/Foreground() – StanislavL

+0

Merci beaucoup cela a fonctionné. Par ailleurs, pourquoi DefaultLookup n'est pas accessible dans mon éclipse. J'utilise JRE 1.6. – u449355

0

utilisation drapeau isSelected dans la méthode getListCellRendererComponent de classe de rendu pour changer la couleur de l'élément sélectionné.

Quelque chose comme:

if(isSelected) 
    setBackground(mySelectedColor) 
else 
    setBackground(myUnselectedColor) 

Note: - Le code ci-dessus n'est pas parfait, vous devez changer comme votre besoin. C'est juste pour démontrer l'utilisation du drapeau isSelected.

+0

Merci pour la réponse. Je ne veux pas définir de couleur. Je veux que ce soit par défaut selon l'apparence. Définir les travaux de fond. Mais je veux la sélection du type bleu combo par défaut. – u449355

+0

@Umesh: Vous devez le définir. Une fois que vous utilisez un moteur de rendu, vous perdez la couleur par défaut (AFAIK). –

Questions connexes