Hallo,
also die Überschrift erklärt schon einen Teil des Problem. Wichtig ist erstmal die Vorgeschichte:
Ich habe ein Formular zum Hinzufügen von Datensätzen in eine DB mit mehreren Comboboxen, jede ComboBox repräsentiert einen Wert der jeweiligen Spalte der Tabelle.
Und zwar sind die Werte die in den ComboBoxen stehen sollen schon vordefiniert in einer Mastertabelle, sprich der Benutzer wählt nur noch die passenden Werte aus und fügt den Datensatz hinzu.
So das Problem ist nun folgendes, die Mastertabelle ist redudant aufgebaut, sprich zu einem Wert gibt es viele verschiedene, z.B: zu Wert1 aus Spalte1 gehören Wert1-100 aus Spalte2. Das soll so funktionieren, das wenn ich in der ersten ComboBox einen Wert auswähle er automatisch in die zweite ComboBox die dazu passenden Werte aus der 2ten Spalte anzeigt.
Das funktioniert alles auch schon, aber mit einem gravierenden Nachteil:
Wenn ich die Form zum Hinzufügen aufrufe, füllt er automatisch schonmal die erste ComboBox mit Werten aus der ersten Spalte, die anderen ComboBoxen sind noch leer.
Wähle ich jetzt in der ersten Box einen Wert aus, so werden in der zweiten Box die dazu passenden anderen Werte angezeigt. Bis dahin läuft alles super.
Aber ich muss immer erst einmal den Wert in einer ComboBox ändern, damit ein Refresh stattfindet, sprich wenn sich nur ein Wert in einer Box befindet, kann man keinen Refresh durchführen um die anderen Boxen mit den passenden Werten zu füllen.
Ich hoffe diese Vorgeschichte ist nicht zu verwirrend.
Mein Lösungansatz der den Nachteil hat, benutzt einen ItemStateChanged Listener, mit folgenden Code-Beispiel:
Und das Code-Beispiel beim Aufruf des Formular:
Bin ein wenig ratlos, wie man dort weiterkommt. Mir kam die Idee einen MouseClick Listener zu benutzen, um die Daten zu ändern, sobald eine ComboBox angeklickt wird, aber der reagiert nicht immer.
Wäre es auch möglich mit einem ActionPerformed Listener?
Die Variablen sind einfach zu erklären:
Es gibt jeweils 4 ComboBoxen, einmal Von und einmal Nach.
Die ersten beiden mit Standort werden beim Aufruf des Formular gefüllt, die andern erst durch Auswahl eines anderen Wertes (Refresh Problem).
Der ItemStateChange Listener ist bei allen ComboBoxen gleich, nur die Abfragen ändern sich etwas.
Ich hoffe jemand kann mir ein wenig helfen und mich auf den richtigen Weg bringen.
Mfg, Strece
also die Überschrift erklärt schon einen Teil des Problem. Wichtig ist erstmal die Vorgeschichte:
Ich habe ein Formular zum Hinzufügen von Datensätzen in eine DB mit mehreren Comboboxen, jede ComboBox repräsentiert einen Wert der jeweiligen Spalte der Tabelle.
Und zwar sind die Werte die in den ComboBoxen stehen sollen schon vordefiniert in einer Mastertabelle, sprich der Benutzer wählt nur noch die passenden Werte aus und fügt den Datensatz hinzu.
So das Problem ist nun folgendes, die Mastertabelle ist redudant aufgebaut, sprich zu einem Wert gibt es viele verschiedene, z.B: zu Wert1 aus Spalte1 gehören Wert1-100 aus Spalte2. Das soll so funktionieren, das wenn ich in der ersten ComboBox einen Wert auswähle er automatisch in die zweite ComboBox die dazu passenden Werte aus der 2ten Spalte anzeigt.
Das funktioniert alles auch schon, aber mit einem gravierenden Nachteil:
Wenn ich die Form zum Hinzufügen aufrufe, füllt er automatisch schonmal die erste ComboBox mit Werten aus der ersten Spalte, die anderen ComboBoxen sind noch leer.
Wähle ich jetzt in der ersten Box einen Wert aus, so werden in der zweiten Box die dazu passenden anderen Werte angezeigt. Bis dahin läuft alles super.
Aber ich muss immer erst einmal den Wert in einer ComboBox ändern, damit ein Refresh stattfindet, sprich wenn sich nur ein Wert in einer Box befindet, kann man keinen Refresh durchführen um die anderen Boxen mit den passenden Werten zu füllen.
Ich hoffe diese Vorgeschichte ist nicht zu verwirrend.
Mein Lösungansatz der den Nachteil hat, benutzt einen ItemStateChanged Listener, mit folgenden Code-Beispiel:
Java:
private void cboVon1PatchenItemStateChanged(java.awt.event.ItemEvent evt) {
if (evt.getStateChange() != ItemEvent.SELECTED) {
cboVon2Patchen.removeAllItems();
try {
patchen = st.executeQuery("SELECT position.Standort, position.Objekt_1, position.Objekt_2, position.Objekt_3, position.Art, position.Bemerkung FROM position LEFT JOIN verbindungen ON (position.Objekt_3 = verbindungen.Von_3 AND position.Objekt_2 = verbindungen.Von_2 AND position.Objekt_1 = verbindungen.Von_1) OR (position.Objekt_3 = verbindungen.Nach_3 AND position.Objekt_2 = verbindungen.Nach_2 AND position.Objekt_1 = verbindungen.Nach_1) WHERE verbindungen.Von_3 IS NULL AND verbindungen.Nach_3 IS NULL AND position.Objekt_1 = '" + cboVon1Patchen.getSelectedItem() + "' Group by position.Objekt_2;");
while (patchen.next()) {
cboVon2Patchen.addItem(patchen.getString("Objekt_2"));
}
} catch (SQLException ex) {
JOptionPane.showMessageDialog(null, ex.getMessage(), "Fehler", JOptionPane.CANCEL_OPTION);
}
}
}
Und das Code-Beispiel beim Aufruf des Formular:
Java:
cboVonStandortPatchen.removeAllItems();
cboVon1Patchen.removeAllItems();
cboVon2Patchen.removeAllItems();
cboVon3Patchen.removeAllItems();
cboNachStandortPatchen.removeAllItems();
cboNach1Patchen.removeAllItems();
cboNach2Patchen.removeAllItems();
cboNach3Patchen.removeAllItems();
try {
patchen = st.executeQuery("Select Standort From position Group by Standort;");
while (patchen.next()) {
System.out.println(patchen.getString("Standort"));
cboVonStandortPatchen.addItem(patchen.getString("Standort"));
cboNachStandortPatchen.addItem(patchen.getString("Standort"));
}
} catch (SQLException ex) {
JOptionPane.showMessageDialog(null, ex.getMessage(), "Fehler", JOptionPane.CANCEL_OPTION);
}
cboVonStandortPatchen.setSelectedIndex(0);
setTextFields();
fraPatchen.setVisible(true);
fraPatchen.setSize(600, 420);
fraPatchen.setLocationRelativeTo(null);
Bin ein wenig ratlos, wie man dort weiterkommt. Mir kam die Idee einen MouseClick Listener zu benutzen, um die Daten zu ändern, sobald eine ComboBox angeklickt wird, aber der reagiert nicht immer.
Wäre es auch möglich mit einem ActionPerformed Listener?
Die Variablen sind einfach zu erklären:
Es gibt jeweils 4 ComboBoxen, einmal Von und einmal Nach.
Die ersten beiden mit Standort werden beim Aufruf des Formular gefüllt, die andern erst durch Auswahl eines anderen Wertes (Refresh Problem).
Der ItemStateChange Listener ist bei allen ComboBoxen gleich, nur die Abfragen ändern sich etwas.
Ich hoffe jemand kann mir ein wenig helfen und mich auf den richtigen Weg bringen.
Mfg, Strece