# JComboBox mit Generics



## Sin137 (1. Dez 2015)

Ich arbeite im Moment an einem Programm und gehe gerade alle Warnings durch und versuche diese zu beheben. (Ist das überhaupt sinnvoll? Hab mal gehört ja)

Nun bin ich an einer Stelle, wo ich eine "JComboBox" anwende. Bisher hatte ich damit noch nie Probleme. Jetzt sagt er mir aber ich sollte Generics einsetzen. Sofern ich dies tue (in meinem Fall <String>) verschwindet die Warnung.

Jetzt könnte man denken "Was will er den noch?".
Ich würde gerne wissen, warum dies benötigt wird. Im Internet habe ich noch keine klare Antwort gefunden.

Ich bedanke mich schon einmal für die Antworten.


----------



## JStein52 (1. Dez 2015)

??  Hast du mal 2-3 Zeilen Code ?


----------



## truesoul (1. Dez 2015)

Hallo Sin137,

Na mit dem Generic sagst du der Combobox welche "Daten" er aufnehmen kann.
In deinem Fall String.

Ein Beispiel:


```
Object[] objects = { 1, "Cat", true, new MeineKlasse(), "Pig" };
JComboBox petList = new JComboBox(objects);
```

So, die Combobox wird alle Anzeigen da sie die toString() Methode verwendet. Wenn du jetzt mit ActionListener arbeitest muss du überprüfen was getSelectedItem() für ein Typ ist. Das ist natürlich umständlich und man kann ja davon ausgehen das deine eine Combobox mit Strings oder mit Integer oder oder oder brauchst.

Gibst du also ein Generic an, kann auch nur ein Typ davon aufgenommen werden.

Soweit klar?

P.S Bin jetzt nicht auf Generics im allgemeinen eingegangen da das ein anderes Thema ist.

Grüße

Markus


----------



## JStein52 (1. Dez 2015)

Aber wo und warum sagt er dir du sollst Generics verwenden ? Bei mir tut er das nicht. Deshalb wäre die Codezeile mal hilfreich


----------



## Sin137 (1. Dez 2015)

Okay habe es verstanden. 
Das war eine tolle Antwort. Ich mach mir das Leben nur einfacher, da ich es spezialisier.
Sofern der Compiler erkennt, dass ich nur Strings in die Combobox einfüge "Warnt" er mich ich solle doch Generics einsetzten.


```
JComboBox<String> show = (JComboBox<String>)e.getComponent().getParent();
```

Wobei hier auch noch eine Warnung wegen des Cast kam.
Diese Warnung habe ich mittels:
@SuppressWarninigs("unchecked") behoben.


----------



## truesoul (1. Dez 2015)

Hallo JStein52, 

gibst du kein Generic an, markiert dir der Eclipse die JCombobox. Mit dem Hinweis "JComboBox is a raw type. References to generic type JComboBox<E> should be parameterized".

Grüße


----------



## JStein52 (1. Dez 2015)

Naja, du hast sie nicht behoben sondern unterdrückt.


----------



## JStein52 (1. Dez 2015)

@truesoul : Danke für den Hinweis. Ich arbeite mit NetBeans. Keine Ahnung ob die das unterschiedlich handhaben ...


----------



## Sin137 (1. Dez 2015)

Stimmt 

Aber warum er den Cast so nicht will, versteh ich nicht.
Daher war das die einzige Lösung die ich wusste.


----------



## truesoul (1. Dez 2015)

Naja,


```
JComboBox<String> show = (JComboBox<String>)e.getComponent().getParent();
```

du castest zu (JComboBox<String>) und nur JComboBox ist gleich JComboBox<Object> wenn ich mich recht entsinne.

Zur Verbeugung gibt die die IDE den Hinweis, das es sinnvoller wäre dann auch den Typ anzugeben.


----------



## Sin137 (1. Dez 2015)

Aber er wollte doch, dass ich die Generics da einfüge und nun ist er damit nicht zufrieden?

Was wäre denn die optimale Lösung in diesem Fall?


----------



## truesoul (1. Dez 2015)

Zeig mal bitte ein wenig mehr Code.


----------



## Sin137 (1. Dez 2015)

Ich hab mehr als 17 Klassen aber ich versuch mal euch die entsprechenden Stellen gut dazustellen:

Das ist die Stelle wo die Combobox deklariert wird. Ich benutze das GridBagLayout.

```
info = new JComboBox<String>();
        info.setPrototypeDisplayValue("");
        info.setEditable(true);
        _controller.autoCompleteHWG(info);
        addComponent(gbc, article, info, 1, 2, 1, 1, 0);
        gbc.anchor = GridBagConstraints.CENTER;
        gbc.insets = new Insets(0, 0, 0, 0);
```

mit dem Methodenaufruf autoCompleteHWG(info) übergebe ich die Combobox dem Controller (MVC), sodass er ein KeyListener hinzufügen kann.

Jetzt will ich in dem KeyListener natürlich auf die Combobox drauf zu greifen. 
Daher:

```
@Override
            public void keyPressed(KeyEvent e) {

                comboBoxItems = _model.searchHWG();           
                               
                @SuppressWarnings("unchecked")
                JComboBox<String> show = (JComboBox<String>)e.getComponent().getParent();
```

Nach meines Wissens, muss ich ja auf das Objekt drauf zugreifen.
Daher verfolge ich den Pfad von e (dem KeyEvent) zurück bis zur Combobox, damit ich genau auf dieses Objekt zugreifen kann.


----------



## truesoul (1. Dez 2015)

Eine Mögliche herangehensweise wäre: 


```
class CustomerActionListener implements ActionListener {

  private JComboBox<String> cb;

  public CustomerActionListener(JComboBox<String> cb) {
    this.cb = cb;
  }

  @Override
  public void actionPerformed(ActionEvent event) {
    if(event.getSource()==cb) {
       cb.getSelectedItem()
    }
  }
}
```

Somit umgehst du dann "Unchecked cast from Object to JComboBox<String>". 
Oder in der Klasse einfach Source ürberprüfen und mit der Varible cb arbeiten. 


```
@Override
  public void actionPerformed(ActionEvent event) {
    if(event.getSource()==cb) {
       cb.getSelectedItem();
    }
  }
```


----------



## Sin137 (1. Dez 2015)

Ja wäre auch zu einfach gewesen selbst darauf zu kommen.
Dankeschön. 

Habe in der Controller-Klasse jetzt eine Variable show angelegt und bei dem Methodenaufruf wo ja eh die cb übergeben wird die cb deklariert.
(facepalm)


----------

