2010-02-01 2 views
1

J'ai un ArrayList<MyObject> parfaitement normal que j'ai besoin d'éditer et choisir un objet.Swing ComboBox avec le choix de "aucun des ci-dessous"

Dans la fenêtre de l'application, j'ai un JComboBox pour sélectionner le bon choix dans la liste. J'écris une boîte de dialogue d'éditeur pour ces objets, qui inclut juste un JList de ces objets et champs d'éditeur. C'est assez facile à faire. Je vais juste avoir une implémentation de ListModel. Collez le ArrayList dans, accédez-y par les champs habituels. Le contenu de la liste de l'interface graphique est une représentation 1: 1 de la substance dans la liste actuelle. Facile. Mais la zone de liste déroulante dans la fenêtre principale de l'application me donne un peu mal à la tête, car j'ai besoin d'une valeur spéciale. Idéalement, le premier élément de la liste doit être "(Aucun)" et renvoyer un null. Est-ce que j'ai juste besoin d'écrire une sorte d'implémentation bizarre ComboBoxModel pour cela, ou y a-t-il une manière plus simple et déjà implémentée de le faire? J'imagine que ce genre de situation a déjà surgi avant.

+1

en utilisant toString() de votre objet pour afficher le contenu approprié dans le combo? – Bozho

Répondre

2

La mise en œuvre de votre propre ComboBoxModel devrait être assez facile.

Depuis cette solution crée une nouvelle Vector de votre ArrayList, les modifications yourArrayList après la création Vector ne seront pas visibles dans votre JComboBox. Si vous en avez besoin, vous devrez alors implémenter votre propre ComboBoxModel (voir implémentation DefaultComboBoxModel).

Vous devriez le faire de toute façon, car il n'y a pas de constructeur DefaultComboBoxModel qui prend un List.

class SpecialComboBoxModel extends DefaultComboBoxModel { 
    public final static String NULL_ELEMENT = "<None>"; 

    public SpecialComboBoxModel(Vector v) { 
     super(v); 
    } 

    @Override 
    public int getSize() { 
     return super.getSize() + 1; 
    } 

    @Override 
    public Object getElementAt(int index) { 
     if(index == 0) { 
      return NULL_ELEMENT; 
     } 
     return super.getElementAt(index - 1); 
    } 
} 


    ArrayList<String> yourArrayList = new ArrayList<String>(); 
    yourArrayList.add("Value1"); 
    yourArrayList.add("Value2"); 
    Vector<String> v = new Vector<String>(yourArrayList); 
    dropdown.setModel(new SpecialComboBoxModel(v)); 
+0

Désolé pour une réponse très lente, mais merci pour cela. J'aurai probablement besoin de plus de travail sur ce code pour combler la différence ArrayList/Vector, mais votre solution était essentiellement celle que je cherchais et semble fonctionner maintenant. – wwwwolf

0

Vous pouvez utiliser un objet nul. Par exemple

public class MyObject { 
    public static final MyObject NULL_OBJECT = new MyObject(); 

    .. 
} 

puis dans votre ArrayList il suffit d'appeler:

arrayList.add(0, MyObject.NULL_OBJECT); 

Vous null-objet doit avoir toutes ses propriétés fixées à null (ou à des valeurs par défaut raisonnables), et votre méthode toString() (si vous l'utilisez), vous devriez retourner "(none)" si tous les champs sont null.

+0

C'est une façon de le faire, même si cela causera des maux de tête lors de l'enregistrement de ArrayList. J'utilise des appels ordinaires JAXB pour cela. De plus, si l'arrayliste a un objet nul comme premier élément, il apparaîtra probablement dans l'éditeur de liste. Cela impliquerait probablement beaucoup d'ajouts manuels et les suppressions de l'objet nul à travailler ... – wwwwolf

+0

Ah, JAXB entre en scène. Fournissez au moins quelques parties de votre code afin que nous puissions donner des réponses adéquates. – Bozho

Questions connexes