2 ComboBox(en)

Bitte aktiviere JavaScript!
Mehr als 5_000 Zeilen? :O Bei 1/100 der Länge bin ich ja schon kurz davor, laut schreiend im Kreis durchs Büro zu rennen...
 
A

Anzeige




Schau mal hier —> (hier klicken)
Hab gerade extra nochmal nachgesehen: die Klasse hat 12.380 Zeilen, es gibt ein paar kleinere Methoden sowie eine mit 5.733, eine mit 3.556 und eine mit 1.649 Zeilen...
WTF?!?
 
Hmm bei meiner Vorschau-Methode für die Tabelle wird der erste Wert mit id=1 nicht angezeigt:
Java:
    public void viewTableForeignBranches() throws SQLException{
        String sql = "SELECT * FROM Filialen_Ausland";
        try (PreparedStatement pst = conn.prepareStatement(sql)) {
            try (ResultSet rs = pst.executeQuery()) {
                if (rs.next()) {
                    jTableFilialen_Ausland.setModel(DbUtils.resultSetToTableModel(rs));
                }
            }
        }   
    }
Ne Idee woran das liegen könnte? :)
 
Vermutlich lädst Du in Deiner resultSetToTableModel-Methode in einer while-Schleife die Daten. Die Schleifenbedingung wird dort rs.next() sein. D. h. Du rufst zu Beginn rs.next() zweimal auf: einmal hier im if und einmal im while in der Methode.
 
Ich habe noch ein Anliegen: Mein Programm umfasst zwei Fenster. Man kann von einem Fenster zu anderen gelangen. Das habe ich bisher so gelöst:

Java:
//von Fenster 1 zu Fenster 2
this.setVisible(false);
Filialen.setVisible(true); //das zweite Fenster

//von Fenster 2 zu Fenster 1
Filialen.setVisible(false);
this.setVisible(true);
Jetzt wollte ich ja, dass die ComboBox(en) nach Editieren der Datenbank aktualisiert werden. Ein eigenes ComboBox Model zu schreiben kann ich aber nicht und wäre glaub zu aufwändig. Daher kam mir die Idee ich könnte doch von Fenster 2 auf Fenster 1 das Programm einfach neustarten - dann würde die ComboBox(en) richtig befüllt sein.

Kann ich das so machen?

Java:
Filialen.dispose(); //soll das zweite Fenster schließen
GUI.main(null); //soll Programm neustarten
Oder muss ich mit System.exit() arbeiten?

Ich verstehe die Unterschiede nicht so richtig.
 
Zuletzt bearbeitet:
Je mehr ich darüber nachdenke, desto weniger verstehe ich, was Du hier eigentlich betreibst. Hast Du mal einen Screenshot oder ähnliches?
 
Abgesehen davon: hattest Du nicht eine Methode, die das ComboBox-Model (mit Daten aus der DB) liefert? Dann bräuchtest Du ja nur das Model der ComboBox zu ersetzen.
Ja, aber dann hatte ich das Problem das die Füllmethode einmal beim Start des Programms ausgeführt wird und dann nochmal beim Klicken des Buttons "Zurück zum Hauptfenster". Das heißt für die ComboBox, dass die sie doppelt befüllt wird. Das könnte ich mit Löschen und dann Befüllen lösen, aber dann fehlt der erste Wert mit "Bitte auswählen".

Hier mal zwei Bilder zum Verständnis:

Erstes Fesnter (Hauptfenster):
11667

Zweites Fenster (zum Editieren der DB):
11668
 
Das heißt für die ComboBox, dass die sie doppelt befüllt wird. Das könnte ich mit Löschen und dann Befüllen lösen, aber dann fehlt der erste Wert mit "Bitte auswählen".
Das kannst Du auch lösen, indem Du beim Befüllen nicht direkt die ComboBox befüllst, sondern ein z. B. DefaultComboBoxModel und dann das Model der ComboBox ersetzt.

Statt
Java:
    private void fillComboBoxGermanBranches() {
        try {
            for (String label : loadGermanBranches()) {
                jComboBoxFilialenDeutschland.addItem(label);
            }
        } catch (SQLException e) {
            e.printStackTrace();
            JOptionPane.showMessageDialog(null, e);
        }
    }
hättest Du dann z. B.
Java:
    private void fillComboBoxGermanBranches() {
        try {
            DefaultComboBoxModel<String> model = new DefaultComboBoxModel<>();
            for (String label : loadGermanBranches()) {
                model.addElement(label);
            }
            jComboBoxFilialenDeutschland.setModel(model);
        } catch (SQLException e) {
            e.printStackTrace();
            JOptionPane.showMessageDialog(null, e);
        }
    }
EDIT: model in der for-Schleife war abhanden gekommen. Hinzugefügt

Zum Screenshot: jetzt verstehe ich, worum es geht. Ich würde Dir dringend(!) empfehlen, den Code zu restrukturieren.
 
Meine Füll-Methode sieht aktuell so aus:
Java:
    private void fillComboBoxGermanBranches() throws SQLException {
        String sql = "SELECT * FROM Filialen_Deutschland";
        try (PreparedStatement pst = conn.prepareStatement(sql)) {
            try (ResultSet rs = pst.executeQuery()) {
                while (rs.next()) {
                    String label = rs.getString("LABEL");
                    //jComboBoxFilialenDeutschland.removeAllItems();
                    //jComboBoxFilialenDeutschland.addItem("Bitte auswählen");
                    jComboBoxFilialenDeutschland.addItem(label);
                }
            }
        }
    }
Was meinst du mit restrukturieren? Das ich es noch mehr aufteilen sollte auf verschiedene Methoden und diese auslagere in Klassen? Was wäre denn der Vorteil davon? Leider wird dieses Programm vermutlich nie wieder jemand anfassen außer mir. In der Firma in der ich als studentische Aushilfe arbeite kann niemand programmieren und die Anforderungen sind extrem gering bzw. habe ich ein sehr begrenztes Zeitbudget (30h lol) und derartige Bemühungen wird vermutlich am Ende niemand hier schätzen bzw. müsste ich diese in meiner Freizeit machen. :/
Oder meinst du etwas anderes damit?
 
Meine Füll-Methode sieht aktuell so aus:
Dann sieht sie halt in Zukunft wie folgt aus :)
Java:
    private void fillComboBoxGermanBranches() throws SQLException {
        String sql = "SELECT * FROM Filialen_Deutschland";
        try (PreparedStatement pst = conn.prepareStatement(sql)) {
            try (ResultSet rs = pst.executeQuery()) {
                DefaultComboBoxModel<String> model = new DefaultComboBoxModel<>();
                model.addItem("Bitte auswählen");
                while (rs.next()) {
                    String label = rs.getString("LABEL");
                    model.addElement(label);
                }
                jComboBoxFilialenDeutschland.setModel(model);
            }
        }
    }
Das ich es noch mehr aufteilen sollte auf verschiedene Methoden und diese auslagere in Klassen? Was wäre denn der Vorteil davon?
Antworte ich gleich noch darauf.
 
Hat länger gedauert. Der Vorteil davon ist, dass Du a) Struktur in den Code bekommst und b) Klassen und Objekte leichter wiederverwenden kannst.

Zum Beispiel: die Tabelle im zweiten Fenster und die ComboBox im ersten Fenster sind unterschiedliche Ansichten derselben Objektliste. Wenn Du diese in einem "Repository" separat darstellst und dieses in beiden Fällen verwendest, weiß das Repository, wann sich etwas geändert hat. Daher kann es interessierte Objekte (Observer) über derlei Änderungen informieren, die ihrerseits entsprechend darauf reagieren können.

Anderes Beispiel: durch bessere Abstraktion kannst Du Code sparen. So unterscheiden sich die verschiedenen ComboBoxen ja nur in der Tabelle, die verwendet wird.

Aber, wenn Du so zurechtkommst und es Dir keiner dankt -> vergiss es.
 
Achso, verstehe.

Wie kann ich denn meine Methoden "auslagern"? Bisher habe ich das teilweise mit anderen Klassen gemacht und diese dann mit Konstruktoraufruf in meiner Hauptklasse eingebunden. Aber wenn ich jetzt eine neue Klasse "LoadSQL"erstelle und in dieser all meine Methoden mit SQL Anweisungen schreiben möchte, dann geht das bisher nicht. Die Methoden funktionieren ja in Hauptklasse schon, mit einem simplen Copy&Paste in LoadSQL ist es aber wohl nicht getan - scheinbar findet es die Methode dann nicht mehr. Könnte das an einem fehlenden Import liegen? (Die Klasse befindet sich im selben package wie meine Hauptklasse "GUI" - benutze Netbeans)
 
Nein, so einfach geht das natürlich nicht, weil die Methoden immer noch stark an das UI gebunden sind. Du müsstest sie erst etwas umschreiben (s. Kommentar #31), so dass sie unabhängig vom UI Ergebnis liefern. In der Regel schreibt man sich ein Repository und bindet das UI daran.
 
Nein, so einfach geht das natürlich nicht, weil die Methoden immer noch stark an das UI gebunden sind. Du müsstest sie erst etwas umschreiben (s. Kommentar #31), so dass sie unabhängig vom UI Ergebnis liefern. In der Regel schreibt man sich ein Repository und bindet das UI daran.
Ja die Methoden habe ich schon tesweise mal geändert, d.h. das ich z.B. GUI-Elemente als übergabe Paramenter allgemein deklariert habe. Also z.B. JComboBox box1 ... und dann setze ich beim Aufruf der Methode entsprechende Comboboxen ein. Das Problem entsteht also nicht in meiner neuen Klasse (da wird nix rot angezeigt), sondern beim Aufruf in der Hauptklasse. (scheinbar findet er meine Methode nicht). Ich weiß aber leider nicht warum
 
Nein, das UI-Elemente haben dort nichts verloren.
Das ist aber glaub die einzige Möglichkeit das Ganze auf 2 Methoden zu beschränken. Wenn ich es so mache, wie du es vorgeschlagen hast, brauche ich noch eine dritte Methode. Objektorientiert zu programmieren, um möglichst Copy&Paste zu vermeiden verstehe ich und finde ich sinnvoll. Das andere kann ich nicht ganz nachvollziehen, evtl. fehlt mir da die Erfahrung im Bereich Softwareprogrammierung. Aktuell scheint mir dass das Ganze nur unnötig zu verkomplizieren :O

Trotzdem danke für deine Hilfe! :)
 
A

Anzeige




Vielleicht hilft dir das hier weiter: (klicke hier)
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben