setSelectedValue in SQL Query übergeben

Chriss_07

Aktives Mitglied
In meiner AutoComboBox benutze ich ein
Java:
setSelectedValue
, dass ich gerne für einen weiteren SQL Query verwenden möchte. Ich weiß aber nicht wie ich das Object übergeben soll
Java:
  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.
SQL:
... WHERE ort = " +  AutoComboBox.setSelectedValue(obj) +"
Ich komm da nicht weiter...???:L
Hat jemand einen Rat?
MfG Chriss
 
Du willst doch Daten aus der DB lesen, also musst du doch einen Getter und keinen Setter aufrufen.

SQL:
... WHERE ort = " +  AutoComboBox.getSelectedValue(obj) +"
 
Ja also wenn ich ein
Java:
 public String getSelectedItem(){
	  System.out.println("Hab dich fest");
	return item;
	  
  }
hinzufüge und vorher als
Java:
private String item = "";
definiere, dann meckert das Query das der Methode nicht static ist. Auch wenn ich die Methode static mache, klappts nicht
Java:
This static method cannot hide the instance method from JComboBox
Außerdem sind die CB's nicht mehr mit dem
Java:
combobox.setSelectedItem("Ort7")
vorbelegt und die Auswahl über das DropDownFeld geht nicht, nur die Autovervollständigung über das Field
 
Du willst doch ein SQL-Statement in der Art:
SQL:
... 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.
 
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.
Java:
	public Object[] getOrt(){
		return CB1.getSelectedObjects();
	}
Und im AutoComboBox:
Java:
	private Object[] ort ;

 public Object[] getOrt(){
	  System.out.println("Hab dich fest");
	return ort;
	  
  }
Aber
SQL:
 ...AutoComboBox.getOrt()..
soll wieder auf static gesetzt werden!
Also macht diese Methode auch nicht was ich will, wo ist mein Denkfehler???:-(
 
Die CB erbt die Methoden von AutoComboBox und ist
Java:
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??
 
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)
 
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
Java:
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?
 
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.

Java:
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.:
Java:
public class ComboBoxDemo ... implements ActionListener {
    . . .
        petList.addActionListener(this) {
    . . .
    public void actionPerformed(ActionEvent e) {
        JComboBox cb = (JComboBox)e.getSource();
        String petName = (String)cb.getSelectedItem();
        updateLabel(petName);
    }
    . . .
}
Statt den Zeilen 7 und 8 musst du dann halt sowas schreiben:
Java:
String ort = (String)cb.getSelectedItem();
updateComboBoxStrassen(ort)
 
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
Java:
 	          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??
 
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
SQL:
'"+ +"'
einbinden
Java:
The operator + is undefined for the argument type(s) String, void
Was tun sprach Zeus?
 
Was tun sprach Zeus?
DB redesignen. Momentan sieht die bei dir wohl so aus:
[TABLE="head"]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_3[/TABLE]
Mach sie lieber so:
[TABLE="head"]id|ort
1|berlin
2|hamburg
3|köln[/TABLE]
[TABLE="head"]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|3[/TABLE]
Dann hast du zwar 2 Tabellen, dafür musst du aber keine neuen Spalten einfügen, das macht man nämlich nicht.

zu
Code:
getOrt()
SQL:
'"+ getOrt() +"'
Getter geben einen Wert zurück, der in den String eingefügt wird. Du hattest zwischen den beiden '+' keinen Wert eingefügt.
 
SQL:
....WHERE ort = ' + AutoComboBox.getOrt() + '.....

erzeugt

Java:
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.
 
....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...
 
aja hier...
Antoras schreibt: '"+ getOrt() +"'
du schreibst: WHERE ort = ' + AutoComboBox.getOrt() + '.....

so gehörts:
WHERE ort = ' " + AutoComboBox.getOrt() + " '.....
 
Upsala Tippfehler von mir.
SQL:
...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:
Java:
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;
	}
Java:
public ComboStrasse getStrasse(String strasse) {
ComboStrasse strassenew= new ComboStrasse();
"SELECT strasse FROM table WHERE ort = '"+ strasse.getOrt() +"'"......;
Denke ich jetzt verkehrt?
 
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.

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

Java:
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;
}
 
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.
Java:
List<ComboStrasse> l = new ArrayList<ComboStrasse>();
Der ComboBox will ich das nun irgendwie übergeben...
Es ärgert mich so - ich hoffe ihr habt noch Lust!!!
 
Laut API gibt es keine Methode, der man eine ArrayList übergeben kann, also bleibt dir nichts anderes übrig, als jedes Element einzeln hinzuzufügen:

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

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

Zurück
Oben