2017-07-07 3 views
1

Ich habe eine JComboBox, an die ich ein Array von Zeichenfolgen übergebe. Einige der Werte sind mehrere Male in diesem Array. Die Combobox ist korrekt gerendert, aber ich kann nicht alle Einträge auswählen.JComboBox gleicher Eintrag mehrmals

String[] entrys = {"A", "B", "C", "A"}; 
JComboBox combo = new JComboBox(entrys); 

In diesem Beispiel werde ich nicht die zweite A auswählen können, weil es bereits eine A früher im Array ist.

combo.addItemListener(new ItemListener() { 
    @Override 
    public void itemStateChanged(ItemEvent e) { 
     if(e.getStateChange() == ItemEvent.SELECTED) 
      System.out.println(combo.getSelectedIndex()); 
    } 
}); 

Wenn ich die zweite A drücken es nach wie vor die erste ist die Auswahl und 0 Druck.

  • Was ist der beste Weg, um dies zum Funktionieren zu bringen?
  • Muss ich ein benutzerdefiniertes ComboBox-Modell schreiben?
+0

Warum haben Sie eine zweite 'A' in Ihren Einträgen? – hamena314

+0

Ich brauche es nur für meine UI, würde zu lange dauern zu erklären ... Zum Beispiel. Es könnte ein Dateiname sein (nicht der vollständige Pfad) und wenn Sie es auswählen, zeigt es Ihnen eine Vorschau, wenn es ein Bild ist. – Galveston01

Antwort

1

Also, im Grunde tut JComboBox dies in der getSelectedIndex Methode ...

public int getSelectedIndex() { 
    Object sObject = dataModel.getSelectedItem(); 
    int i,c; 
    E obj; 

    for (i=0,c=dataModel.getSize();i<c;i++) { 
     obj = dataModel.getElementAt(i); 
     if (obj != null && obj.equals(sObject)) 
      return i; 
    } 
    return -1; 

Aus diesem Grund, wenn Sie A wählen, ist es 0 Rückkehr, weil es den gewählten Wert ein Objekt findet passende auf Position 0. Sie benötigen ein einzigartiges Objekt-Wrapper um die Werte zu erzeugen, die den Vergleich ermöglicht es den richtigen Wert

Vielleicht wie etwas zu wählen ...

public class Wrapper { 
    private final String value; 

    public Wrapper(String value) { 
     this.value = value; 
    } 

    public String getValue() { 
     return value; 
    } 

    // I personally prefer to use a custom cell renderer, but 
    // for the sake of brevity, I'm using the toString method instead 
    @Override 
    public String toString() { 
     return value; 
    } 

} 

Dann müssen wir die String Werte abzubilden ...

String[] entrys = {"A", "B", "C", "A"}; 
Wrapper[] wrappers = Arrays.stream(entrys).map((String t) -> new Wrapper(t)).toArray(Wrapper[]::new); 
JComboBox<Wrapper> b = new JComboBox<>(wrappers); 

und wir sind alle eingestellt. Denken Sie daran, Sie haben es mit der Wrapper Klasse, nicht String s, wenn Sie getSelectedItem verwenden, so müssen Sie sie auspacken

+0

Danke! Ich benutze bereits eine Klasse, die ich als Wrapper verwenden kann (einfach nicht geschrieben, um den Code einfach zu halten), aber ich wusste nicht über die Möglichkeit eines benutzerdefinierten CellRenderers und kann diese Klassen nicht überschreiben toString-Methode. Ich denke, ich versuche nur, mich über benutzerdefinierte Cell-Renderer zu informieren, um es auf diese Weise zu versuchen. – Galveston01