2010-07-26 4 views
3

Espérons que c'est une question facile.Personnalisé JComboBox top label

De l'exemple sur http://download.oracle.com/docs/cd/E17409_01/javase/tutorial/uiswing/components/combobox.html sur « Fournir une coutume Renderer » section, je peux faire une JComboBox comme

Picture 3 - Text 3 
------------------- 
Picture 1 - Text 1 
Picture 2 - Text 2 
Picture 3 - Text 3 
Picture 4 - Text 4 
Picture 5 - Text 5 

Picture 3 - Text 3 est l'élément sélectionné.

Est-il possible d'avoir une étiquette personnalisée? Tels que

Text 3 
------------------- 
Picture 1 - Text 1 
Picture 2 - Text 2 
Picture 3 - Text 3 
Picture 4 - Text 4 
Picture 5 - Text 5 

Lorsque l'image est pas affiché lorsque la zone de liste déroulante est dans son état réduit au minimum.

Je l'ai utilisé une JFrame popup DButton/undecorated à imiter avant, mais me demande s'il est possible de faire avec un JComboBox pur

Merci

Répondre

2

Est-il possible d'avoir une étiquette personnalisée? Tels que ...

Oui. Le même rendu est utilisé pour afficher la liste déroulante et l'élément sélectionné dans la zone de liste déroulante. La valeur sélectionnée est renderer lorsque l'index de rendu est -1, vous pouvez donc personnaliser le rendu comme vous le souhaitez. Quelque chose comme:

import java.awt.*; 
import java.awt.event.*; 
import java.util.*; 
import javax.swing.*; 
import javax.swing.plaf.basic.*; 

public class ComboBoxItemIcon extends JFrame 
{ 
    public ComboBoxItemIcon() 
    { 
     Vector model = new Vector(); 
     model.addElement(new Item(new ImageIcon("copy16.gif"), "copy")); 
     model.addElement(new Item(new ImageIcon("add16.gif"), "add")); 
     model.addElement(new Item(new ImageIcon("about16.gif"), "about")); 

     JComboBox comboBox; 

     comboBox = new JComboBox(model); 
     comboBox.setRenderer(new ItemRenderer()); 
     getContentPane().add(comboBox, BorderLayout.SOUTH); 
    } 

    class ItemRenderer extends BasicComboBoxRenderer 
    { 
     public Component getListCellRendererComponent(
      JList list, Object value, int index, 
      boolean isSelected, boolean cellHasFocus) 
     { 
      super.getListCellRendererComponent(list, value, index, 
       isSelected, cellHasFocus); 

      Item item = (Item)value; 

      if (index == -1) 
      { 
       setText(item.getText()); 
       setIcon(null); 
      } 
      else 
      { 
       setText(item.getText()); 
       setIcon(item.getIcon()); 
      } 

      return this; 
     } 
    } 

    class Item 
    { 
     private Icon icon; 
     private String text; 

     public Item(Icon icon, String text) 
     { 
      this.icon = icon; 
      this.text = text; 
     } 

     public Icon getIcon() 
     { 
      return icon; 
     } 

     public String getText() 
     { 
      return text; 
     } 
    } 

    public static void main(String[] args) 
    { 
     JFrame frame = new ComboBoxItemIcon(); 
     frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

} 
+0

merci de me faire connaître la valeur -1 de l'index. fonctionne parfaitement! –

1

fonction Il semble y avoir trois appels dans le render racontai à afficher l'image et le texte:

setIcon setText setFont

Je n'ai pas compilé cet exemple, mais je voudrais essayer et commenter setIcon (ico n); de la fonction getListCellRendererComponent car cela semble afficher l'image pour l'élément sélectionné.

Si le commentaire brise le code, j'essayerais de remplacer une image vide ou quelque chose comme solution de contournement.

+0

fermer, en utilisant 'setIcon (null)' quand 'isSelected' est vrai. mais alors il y a l'effet indésirable de l'élément n'ayant aucune image dans la liste déroulante quand c'est la sélection active. –

+0

Je pense que le composant sélectionné minimisé ne peut pas être complètement indépendant de la liste sans définir JComboBox.setEditable (true). Ou peut-être mettre en place un écouteur d'action, en changeant le modèle en premier pour le composant sélectionné (de sorte que juste l'étiquette est légale), puis en mettant à jour la sélection par programmation. Cela semble beaucoup de travail. De toute façon, je vais vous donner les points kniemczak –