Alex_winf01 Geschrieben 1. Januar 2008 Geschrieben 1. Januar 2008 Ich habe eine JList, die auf eine Schaltfläche reagiert: /*-------------------------------------------------------------------*/ /**J L i s t */ /*-------------------------------------------------------------------*/ String[] liste_dokumentationen_s = {"anzahl_dokumentationen", "fall_nummer"}; liste_dokumentation = new JList(defaultlistmodel_weitereDokumentationen); liste_dokumentation.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); liste_dokumentation.setSelectedIndex(0); liste_dokumentation.setSize(50,50); liste_dokumentation.setSelectionMode(0); doku_scrollPane = new JScrollPane(liste_dokumentation); doku_scrollPane.setViewportView(liste_dokumentation); /*-------------------------------------------------------------------*/ /**JList mit Werten aus der Datenbank auslesen*/ /*-------------------------------------------------------------------*/ int a = Fragebogen.patienten_liste.getSelectedIndex(); String b = Fragebogen.fall_nummer_text.getText(); try { String query_wDoku = "SELECT * FROM dokumentation where dokumentation_fall_nummer = " + "'" + b + "'"; // Statement erzeugen Statement wDoku_st = Login.connection.createStatement(); // Query ausführen ResultSet wDoku_rs = wDoku_st.executeQuery(query_wDoku); //Daten einlesen und auf dem Bildschirm ausgeben while (wDoku_rs.next()) { String anzeige_anzahl_dokumentation_JList; anzeige_anzahl_dokumentation_JList = wDoku_rs.getString("anzahl_dokumentation"); defaultlistmodel_weitereDokumentationen.addElement(anzeige_anzahl_dokumentation_JList); } wDoku_st.close(); } catch(SQLException d1) { JOptionPane.showMessageDialog(null, " Fehler beim Datenbankabbau " + d1, "DB-Meldung", JOptionPane.ERROR_MESSAGE); } liste_dokumentation.addListSelectionListener(new SelectionHandler3()); cp.add(doku_scrollPane); Klick ich auf die Schaltfläche, werden die Ergebnis der Abfrage dort angezeigt. So weit so gut. Klicke ich ein zweites Mal auf die Schaltfläche, werden die Ergebnisse des 1. Klicks mit angezeigt. Wie kann ich das verhindern? Es soll ja nur die Ergebnisse des aktuellen Klicks angezeigt werden. Zitieren
_Arvid_ Geschrieben 1. Januar 2008 Geschrieben 1. Januar 2008 Rufe doch vorher einfach die Methode clear() auf das DefaultListModel auf. Zitieren
Alex_winf01 Geschrieben 1. Januar 2008 Autor Geschrieben 1. Januar 2008 @ _Arvid_ Vielen Dank für Deine schnelle Antwort. Ich habe da noch zwei weitere Probleme mit JList: 1. Problem Ich füttere meine JList mit Werten aus der DB. Ich habe eine Schaltfläche "Neues Kriterium festlegen", mit dem der Anwender entscheiden kann, ob in der Liste Nummern oder der Name angezeigt werden soll. Der Handler sieht wie folgt aus: class listeSortierenListener implements ActionListener { public void actionPerformed(ActionEvent e) { String text = "Welches Kriterium soll in der Liste angezeigt werden?"; stringSort = ( String ) JOptionPane.showInputDialog(null, "Kriterium für Liste", "Dialog", JOptionPane.QUESTION_MESSAGE, new ImageIcon("img/middle.gif"), sortierung, sortierung[0]); String stringSortWert = stringSort; if (stringSortWert.equals("Name")) { kriterium = "nachname"; liste.updateUI(); scrollPane.setViewportView(liste); try { String lese_nachname = "Select * from anwender"; Statement stmt_nachname = Login.connection.createStatement(); ResultSet result_nachname = stmt_nachname.executeQuery(lese_nachname.toString()); // Anzeige neuer DS in der Liste for (;result_nachname.next();defaultlistmodel.addElement(anzeige_JList)) { anzeige_JList = result_nachname.getString(kriterium); } pack(); stmt_nachname.close(); } catch(SQLException a) { JOptionPane.showMessageDialog(null, " Fehler beim Datenbankabbau" + e, "DB-Meldung", JOptionPane.ERROR_MESSAGE); } liste.addListSelectionListener(new SelectionHandler_Nachname()); } if (stringSortWert.equals("Fall-Nummer")); { kriterium = "fall_nummer"; liste.updateUI(); scrollPane.setViewportView(liste); try { String lese_fallnummer = "Select * from anwender"; Statement stmt_fallnummer = Login.connection.createStatement(); ResultSet result_fallnummer = stmt_fallnummer.executeQuery(lese_fallnummer.toString()); // Anzeige neuer DS in der Liste for (;result_fallnummer.next();defaultlistmodel.addElement(anzeige_JList)) { anzeige_JList = result_fallnummer.getString(kriterium); } pack(); stmt_fallnummer.close(); } catch(SQLException a) { JOptionPane.showMessageDialog(null, " Fehler beim Datenbankabbau" + e, "DB-Meldung", JOptionPane.ERROR_MESSAGE); } liste.addListSelectionListener(new SelectionHandler_FallNummer()); } } } 2. Problem: Wähle ich den Punkt "Fall-Nummer" aus, werden auch nur die Fall-Nummern angezeigt. Wähle ich den Punkt "Nachname" aus, werden mir die Nachnamen + die Fallnummern angezeigt. Wie kann ich das verhindern? 3. Problem: Wenn ich diese Schaltfläche benutze und zwischen Fall-Nummer und Nachname wähle, verschwindet nach Aktualisierung der JList ein Teil der GUI. Schließe ich das Fenster und öffne es wieder ganz normal, wird mir das GUI wieder richtig angezeigt. Wie kann ich das vermeiden? Zitieren
_Arvid_ Geschrieben 2. Januar 2008 Geschrieben 2. Januar 2008 Also zunächst einmal hättest du die Fallunterscheidung so gut wie gar nicht benötigt. Bei den beiden Teilen mit Fall-Nummer und Namen machst du im Grunde das Gleiche (fast jedenfalls). Hier kannst du also etwas zusammenfassen und dadurch einige Codezeilen sparen. Des Weiteren fiel mir auf, dass du der Liste jedes Mal einen neu erzeugten ListSelectionListener anhängst, wenn ein Kriterium vom Benutzer gewählt wird. Das ist wohl eher suboptimal. Die Listener jeweils einmal zu adden, sollte wohl reichen. Bereinige deinen Code entsprechend etwas. Vielleicht ergibt sich das eine oder andere Problem dabei von selbst. Auf jeden Fall wird es wieder ein Stück übersichtlicher und möglicherweise findest du dann die Fehlerursachen selbst. Anderenfalls melde dich nochmal. =) Zudem verstehe ich die Schilderung des dritten Problems nicht so recht. Klingt nach fehlendem Repaint. :confused: Zitieren
Alex_winf01 Geschrieben 3. Januar 2008 Autor Geschrieben 3. Januar 2008 @ _Arvid_ das Problem mit der JList ist gelöst. Es hat ganz simpel ein return; gefehlt. Damit habe ich sämtliche Probleme gelöst. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.