# setSelectedValue in SQL Query übergeben



## Chriss_07 (1. Jun 2010)

In meiner AutoComboBox benutze ich ein 
	
	
	
	





```
setSelectedValue
```
, dass ich gerne für einen weiteren SQL Query verwenden möchte. Ich weiß aber nicht wie ich das _Object_ übergeben soll

```
void setSelectedValue(Object obj) {
    if (isFired) {
      return;
    } else {
      isFired = true;
      setSelectedItem(obj);
      fireItemStateChanged(new ItemEvent(this, 701, selectedItemReminder,
          1));
      isFired = false;
      System.out.println("Hab dich");
      return;
    }
  }
```
Das _Object_ ist ein Ort aus einer ComboBox
mit dem nun die zugehörigen Strassen ermittelt werden sollen.
	
	
	
	





```
... WHERE ort = " +  AutoComboBox.setSelectedValue(obj) +"
```
Ich komm da nicht weiter...???:L
Hat jemand einen Rat?
MfG Chriss


----------



## Antoras (1. Jun 2010)

Du willst doch Daten aus der DB lesen, also musst du doch einen Getter und keinen Setter aufrufen.


```
... WHERE ort = " +  AutoComboBox.getSelectedValue(obj) +"
```


----------



## Chriss_07 (1. Jun 2010)

Ja also wenn ich ein 

```
public String getSelectedItem(){
	  System.out.println("Hab dich fest");
	return item;
	  
  }
```
hinzufüge und vorher als 
	
	
	
	





```
private String item = "";
```
 definiere, dann meckert das Query das der Methode nicht _static_ ist. Auch wenn ich die Methode _static _mache, klappts nicht 
	
	
	
	





```
This static method cannot hide the instance method from JComboBox
```
Außerdem sind die CB's nicht mehr mit dem 
	
	
	
	





```
combobox.setSelectedItem("Ort7")
```
 vorbelegt und die Auswahl über das DropDownFeld geht nicht, nur die Autovervollständigung über das _Field_


----------



## Antoras (1. Jun 2010)

Du willst doch ein SQL-Statement in der Art:

```
... WHERE ort ='berlin'
```

Also musst du dafür sorgen, dass du eine Methode definierst, die den Ort zurück gibt.

Die Fehlermeldung kommt wohl daher, weil du versuchst auf ein nicht instantiiertes AutoComboBox-Objekt zuzugreifen. Dein AutoComboBox-Objekt erbt wohl von JComboBox, also kannst du die Methode auch nicht einfach so auf static setzen. Also entweder eine eigene Methode erstellen, die das macht, oder AutoComboBox instantiieren.


----------



## Chriss_07 (1. Jun 2010)

Ja genau, wenn Berlin also aus der ersten CB ausgewählt wurden sollen in der zweiten CB die Strassen von Berlin angezeigt werden.
ein _get.SelectedItem_ geht nicht bei editierbarer CB, also habe ich ein getSelectedObject erstellt.

```
public Object[] getOrt(){
		return CB1.getSelectedObjects();
	}
```
Und im AutoComboBox:

```
private Object[] ort ;

 public Object[] getOrt(){
	  System.out.println("Hab dich fest");
	return ort;
	  
  }
```
Aber

```
...AutoComboBox.getOrt()..
```
 soll wieder auf _static _gesetzt werden!
Also macht diese Methode auch nicht was ich will, wo ist mein Denkfehler???:-(


----------



## Chriss_07 (1. Jun 2010)

Die CB erbt die Methoden von AutoComboBox und ist 
	
	
	
	





```
public static void main(String[] args) throws Exception {			
	    new NewJFrame().setVisible(true);
	 }
```
_static_?? Und meine Methode _getSelectedObjects()_ in der Klasse der NewJFrame ist eine _non-static Methode_??


----------



## Antoras (1. Jun 2010)

Lies dir das mal durch: http://www.java-forum.org/stichwort-static/1353-bedeutet-static.html

Das was du machen willst ist doch nicht so schwer. Du lädst alle Städtenamen. Sobald du nun in der CB ein Item auswählst, wird ein Event ausgelöst, mit dessen Hilfe du alle Strassen der ausgewählten Stadt in eine weitere CB nachladen kannst.

Hier noch mal zur Erklärung wie du an die Items eines CB kommst: How to Use Combo Boxes (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)


----------



## Chriss_07 (1. Jun 2010)

Hast recht, war es auch nicht
Danke für dein Tipp mit der eigenen Methode - das war die Lösung.
Die Methode ist allerdings _static_

```
public static Object getOrt(){
```
 und dann klappt es auch mit dem SQL Query.
Der Ort, der als setSelectedItem ("Ort7") hinterlegt ist, wird für die zweite Datenbankabfrage herangezogen. Ändere ich aber den Ort in der ComboBox, dann wird die neue Auswahl nicht übergeben. Somit wird die Methode nur beim Programmstart aufgerufen. Wie kann ich die Methode wieder neu aufrufen, wenn _ContentsChanged_?


----------



## Antoras (1. Jun 2010)

Das Schlüsselwort static sollte nur mit bedacht eingesetzt werden und auch nur dann wenn man weiß was man mit ihm genau erreichen kann. In deinem Fall ist es unnötig.


```
AutoComboBox acb = new AutoComboBox();
acb.getOrt();
```
Dies ermöglicht dir, dass deine Methode nicht mehr statisch sein muss. 

Auf der von mir geposteten Seite steht doch sogar ein Beispiel, das dein Problem löst:


			
				http://java.sun.com/docs/books/tutorial/uiswing/components/combobox.html hat gesagt.:
			
		

> ```
> public class ComboBoxDemo ... implements ActionListener {
> . . .
> petList.addActionListener(this) {
> ...


Statt den Zeilen 7 und 8 musst du dann halt sowas schreiben:

```
String ort = (String)cb.getSelectedItem();
updateComboBoxStrassen(ort)
```


----------



## Chriss_07 (3. Jun 2010)

So ich bin etwas weiter gekommen
Wenn ich den von dir beschrieben Weg gehe, muss für _updateComboBoxStrassen(ort)_ ein actionListener geschrieben werden. Damit rufe ich die Methode _getOrt()_ im _AutoComboBoxModel _wieder auf. _getOrt()_ muss nun aber wieder  _static_ sein. Somit übergeb ich das _SelectedItem_ der Methode _getOrt()_.
So far so good: Meine Datenbank ist folgendermaßen aufgebaut: Als _Column_Names_ verwende ich die Städtenamen, in den _rows_ dann die Strassen.
Die Städte lese ich mit 
	
	
	
	





```
String col_name = md.getColumnName(i);
	          results.add(col_name);
	        }
```
 aus. Die werden auch in der _ComboBox_ angezeigt.

Wie kann ich in den _Column_names _nach dem _getOrt()_ suchen??


----------



## Antoras (3. Jun 2010)

Chriss_07 hat gesagt.:


> _getOrt()_ muss nun aber wieder  _static_ sein.


Nein, das muss du nur wenn du keine Instanz von deinem Objekt anlegst.


Chriss_07 hat gesagt.:


> Wie kann ich in den _Column_names _nach dem _getOrt()_ suchen??


Das hast du doch schon ganz am Anfang gepostet? Einfach mit der WHERE-Klausel die Orte von einer beliebigen Stadt raussuchen.


----------



## Chriss_07 (3. Jun 2010)

Ich habe die DB verändert. Zuerst habe ich den SQL Query getestet mit ORT STRASSE, jeweils in den Rows den Ort und die Strassen. Das erscheint mir aber als absoluter Quatsch, weil ich immer Ort und Strasse einfügen muss. Nun stellen die _ColumNAmes/Header_ die Städte dar und in den rows sind die Strassen. Hat zum Vorteil, das ich bei wachsender DB einmal den neuen Ort anfüge und nur noch die Strassen in die rows eingebe.

Stimmt, ich habe keine Instanz von meinem Objekt angelegt, weil mit Instanz _cb.getOrt()_ ich den _ActionListener_ _updateAutoComboBox_ nicht iniziieren kann. Mit _static_ in der Methode lass ich die Instanz weg und kann den _ActionListener_ aufrufen.
Aber _getOrt()_ übergibt ein String an meine SQLQuery und den kann ich nicht mit 
	
	
	
	





```
'"+ +"'
```
 einbinden 
	
	
	
	





```
The operator + is undefined for the argument type(s) String, void
```
Was tun sprach Zeus?


----------



## Antoras (3. Jun 2010)

Chriss_07 hat gesagt.:


> Was tun sprach Zeus?


DB redesignen. Momentan sieht die bei dir wohl so aus:


berlin|hamburg|köln
str_berlin_1|str_hamburg_1|str_köln_1
str_berlin_2|str_hamburg_2|str_köln_2
str_berlin_3|str_hamburg_3|str_köln_3Mach sie lieber so:


id|ort
1|berlin
2|hamburg
3|köln

strasse|ort
str_berlin_1|1
str_berlin_2|1
str_berlin_3|1
str_hamburg_1|2
str_hamburg_2|2
str_hamburg_3|2
str_köln_1|3
str_köln_2|3
str_köln_3|3Dann hast du zwar 2 Tabellen, dafür musst du aber keine neuen Spalten einfügen, das macht man nämlich nicht.

zu 
	
	
	
	





```
getOrt()
```


```
'"+ getOrt() +"'
```
Getter geben einen Wert zurück, der in den String eingefügt wird. Du hattest zwischen den beiden '+' keinen Wert eingefügt.


----------



## Chriss_07 (4. Jun 2010)

```
....WHERE ort = ' + AutoComboBox.getOrt() + '.....
```

erzeugt


```
The operator + is undefined for the argument type(s) String, void
```

Ich nehme an, dass _.getOrt()_ einen String enthält, der + Operator dafür nicht zulässig ist.


----------



## ARadauer (4. Jun 2010)

> ....WHERE ort = ' + AutoComboBox.getOrt() + '.....


ist sowieso nix...

1. steht da wirklich ein ' ? versuch mal mit " 
2. Was hat diese GUI Komponente bei dem Query zu suchen? Versuch die Gui vom Datenbankzugriff zu trennen. .. das heißt du übergibst den Ort String aus der Combobox einer Methode eines Objekts das spezell für den Zugfriff auf die Datenbank zuständig ist...
3. Verwende bitte Prepared Statements...


----------



## ARadauer (4. Jun 2010)

aja hier...
Antoras schreibt: '"+ getOrt() +"'
du schreibst: WHERE ort = ' + AutoComboBox.getOrt() + '.....

so gehörts:
WHERE ort = ' " + AutoComboBox.getOrt() + "  '.....


----------



## Chriss_07 (4. Jun 2010)

Upsala Tippfehler von mir.

```
...WHERE ort = ' " + AutoComboBox.getOrt() + " ' ....
```
 verwende ich ja auch.
Ich Trenne also GUI vom DB-Zugriff mittels einer neuen Klasse _ComboStrasse_ in der ich die Methode _getOrt()_ deklariere und eine Referenz zur Methode _getOrt()_ in der GUI schaffe.
Dann kann ich doch mittels:

```
private String strasse = "";
private String ort = "";
	
	
	
	public String getStrasse() {
		return strasse;
	}
	
	public void setStrasse(String strasse) {
		this.strasse= strasse;
	}
	
	public String getOrt() {
		return ort;
	}
	
	public void setOrt(String ort) {
		this.ort= ort;
	}
```


```
public ComboStrasse getStrasse(String strasse) {
ComboStrasse strassenew= new ComboStrasse();
"SELECT strasse FROM table WHERE ort = '"+ strasse.getOrt() +"'"......;
```
 Denke ich jetzt verkehrt?


----------



## Antoras (4. Jun 2010)

Genau, du kannst dir einen Container bauen, der deine Objekte beinhaltet. Allerdings kann es erstens mehrere Straßen geben, die in einer Stadt sind und zweitens willst du doch die Strassen zum Ort und nicht umgekehrt.


```
class ComboStrasse {
  String ort, strasse;
  public ComboStrasse(String ort, String, strasse) {
    this.ort = ort;
    this.strasse = strasse;
  }
  // Getters and Setters
}
```


```
public List<ComboStrasse> getStrassen(String ort) {
  List<ComboStrasse> l = new ArrayList<ComboStrasse>();
  
  try {
    String sql = "SELECT strasse FROM table WHERE ort=?";
    PreparedStatement ps = connection.prepareStatement(sql);
    ps.setString(1, ort);
    ResultSet r = ps.executeQuery();
    
    while (r.next()) {
      ComboStrasse c = new ComboStrasse(ort, r.getString(1));
      l.add(c);
    }
  } catch (SQLException e) {
    e.printStackTrace();
  }
  return l;
}
```


----------



## Chriss_07 (6. Jun 2010)

Super, nun funktioniert es 
Danke


----------



## Chriss_07 (7. Jun 2010)

Oder auch nicht.. 
Also ich roll das Thema nocheinmal auf, ich hoffe das ist ok. Nachdem ich gestern jede Menge gelöscht und geändert hatte, bekomme ich das Array nicht der zweiten _ComboBox_ übergeben.
Zum Mäuse melken.
Ich lese den Ort aus (klappt!) und übergebe ihn als _String _dem zweiten _SQL Query_.

Die zweite Abfrage wird ins Array geschrieben. 

```
List<ComboStrasse> l = new ArrayList<ComboStrasse>();
```
Der ComboBox will ich das nun irgendwie übergeben...
Es ärgert mich so - ich hoffe ihr habt noch Lust!!!


----------



## Antoras (7. Jun 2010)

Laut API gibt es keine Methode, der man eine ArrayList übergeben kann, also bleibt dir nichts anderes übrig, als jedes Element einzeln hinzuzufügen:


```
for (ComboStrasse c : getStrassen(ort)) {
  comboBox.addItem(c.getStrasse());
}
```

Und beim nächsten Mal erst den alten Quelltext löschen wenn der Neue geht.


----------

