Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Probleme mit der JList

Empfohlene Antworten

Veröffentlicht

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.

Rufe doch vorher einfach die Methode clear() auf das DefaultListModel auf.

  • Autor

@ _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?

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:

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.