2016-07-26 2 views
1

JList deklariert eine Methode: public void setSelectedIndices(int[] indices)Warum verwendet JList int [], um Indizes auszuwählen, wenn ein Integer-Satz benötigt wird?

, die nach Änderungen an der Dokumentation von Oracle:

die Auswahl der Menge der Indizes durch die gegebene Array

ich, dass ein Set weiß angegeben sein Primitive Int kann nicht als generischer Typ genommen werden.

Wie die Indizes abgerufen werden, die ich auswählen möchte? Für jetzt verwende ich eine Set<Integer>, Schleife durch die Zeilen und wenn eine Zeile ausgewählt ist, fügen Sie es zu Set<Integer>.

Aber dann muss ich die Set<Integer> in eine int[] konvertieren und es gibt keine eingebaute Funktion, das zu tun. Ich weiß bereits, wie man die Übersetzung macht.

Muss jemand, der public void setSelectedIndices(int[] indices) verwendet, seinen eigenen Konverter entwickeln oder einen von Guava oder Apache verwenden?

Dies scheint ein Fehler in Swing zu sein. Gibt es einen Grund, warum diese Methode keine Set oder sogar eine List annehmen kann?

Oder gibt es eine Möglichkeit, eine Reihe von Primitiven zu erstellen, die ich nicht kenne?

Wäre es nicht besser für jeden Entwickler, wenn die Methode ein Set<Integer> als Argument nahm? Warum ist das nicht der Fall?

+1

Mögliche Duplikat von [ Wie kann ich einen Java HashSet in ein primitives int Array konvertieren?] (Http://stackoverflow.com/questions/2451184/how-can-i-convert-a-java-hashsetinteger-to-a-primitive-int- Array) – Tom

+0

@Tom: Diese Frage fragt speziell, ob es einen Fehler in Swing gibt. Ich weiß bereits, wie man eine Sammlung in ein Array umwandelt. Was ich wissen möchte, ist, warum diese spezifische Methode ein Array von primitiven int verwendet, wenn sie nur ihre Benutzer dazu verpflichtet, eine Übersetzung zu machen, die NICHT im Java-Standard ist. – vdolez

+1

Swing, seit 1.2, älter als Generika, seit 1.5. Warum nicht 'setSelectedIndices() 'überladen? – trashgod

Antwort

2

können Sie die SelectionModel als Abhilfe verwenden:

Set<Integer> indices = ... 
... 
myList.getSelectionModel().clearSelection() 
for(Integer index : indices) { 
    myList.getSelectionModel().addSelectionInterval(index, index); 
} 

Inspiriert von JList.setSelectedIndices():

public void setSelectedIndices(int[] indices) { 
    ListSelectionModel sm = getSelectionModel(); 
    sm.clearSelection(); 
    int size = getModel().getSize(); 
    for (int i : indices) { 
     if (i < size) { 
      sm.addSelectionInterval(i, i); 
     } 
    } 
} 
+0

Während dies ein praktikabler Weg ist, würde ich eine wiederverwendbare Lösung bevorzugen.Ich möchte nicht jedes Mal eine for-Schleife programmieren, wenn ich Indizes setzen muss. Danke für deine Antwort trotzdem :) – vdolez

2

Swing, verfügbar seit Java 1.2, Generika früher, in Java 1.5 eingeführt. In der Zwischenzeit wurden Generika zu Swing hinzugefügt, bei denen der Nutzen das Risiko einer Rückwärtsinkompatibilität überwiegt. Zum Beispiel ist JList selbst JList<E> seit Java 1.7 gewesen. Da setSelectedIndices() „ist eine bequeme Methode, um die Auswahl und verwendet dann addSelectionInterval() auf der Auswahlmodell die Indizes hinzufügen löscht,“ die Methode überlasten kann wie gewünscht (Bereich für Klarheit elided Prüfung):

private static class MyList extends JList { 

    public void setSelectedIndices(Set<Integer> indices) { 
     ListSelectionModel model = getSelectionModel(); 
     model.clearSelection(); 
     for (Integer index : indices) { 
      model.addSelectionInterval(index, index); 
     } 
    } 
Verwandte Themen