ListSelectionListener wird mehrfach initialisiert

chriz66

Mitglied
Guten Morgen Forum,

als Neuling habe ich ein Problem, bei dem Ihr mir hoffentlich weiterhelfen könnt.
Ich baue gerade mein erstes Programm, welches eine Auswahl mehrerer Verzeichnisse bietet, beim Klick auf einen Button wird die Verzeichnisliste in eine jList geladen (nur JPGS) und beim Klick auf eine Datei wird das Bild angezeigt. Das klappt wunderbar!

Böse wird es, wenn ich die Auswahl ändere - der Inhalt der jList also ausgetauscht wird. Dann wird der ListSelectionListener ein zweites mal initialisiert und das führt zum Fehler. Wie kann ich abfragen, ob jList schon einen Listener hat, bzw. kann ich den alten Listener entfernen und nach Laden der Liste einen neuen Listener starten?

Hm, das ist gerade wohl etwas verwirrend 🙂

Hier mal der Code, der ausgeführt wird, wenn man ein Verzeichnis auswählt. Evtl. hilft das ja weiter 😉

Java:
private void jButton1MouseClicked(java.awt.event.MouseEvent evt) {                                      

    
    /* das ist die Verzeichnisauswahl */
    final String itemText = (String)jComboBox1.getSelectedItem();
    jTextField1.setText(itemText);
    FTPConnect connect = new FTPConnect();
    
    try{
        fileList.clearSelection();
        String[] fList = connect.getFiles(itemText.toLowerCase()); 
        fileList.setListData(fList);
        
      fileList.addListSelectionListener(new ListSelectionListener() {      
       public void valueChanged(ListSelectionEvent evt) {
           
            if(evt.getValueIsAdjusting() ){ return; }
                    
                picLabel.setIcon(null);
                String picName = fileList.getSelectedValue().toString();
                String pName = picName.substring(2);
                
                try{
                    FTPClient ftpConn = new FTPClient();
                    ftpConn.connect("server");
                    ftpConn.login(itemText, "kennwort");
                    InputStream getPic = ftpConn.retrieveFileStream(pName);

                    ImageIcon icon = new ImageIcon( ImageIO.read(getPic), "meinBild");

                    int iWidth = icon.getIconWidth();
                    int iHeight = icon.getIconHeight();

                    int nHeight = (iHeight * 400)/iWidth;

                    icon.setImage(icon.getImage().getScaledInstance(400,nHeight,Image.SCALE_DEFAULT)); 
                    picLabel.setIcon(icon);
                    ftpConn.disconnect();
                }catch (Exception e){
                    JOptionPane.showMessageDialog(mainPanel, "Fehler Ausstieg: "+e.getMessage());
                    System.exit(0);
                }finally{
                    
                }
            }
      });
    }catch(Exception e){
        
    }
    
}

Es wäre klasse, wenn mir da jemand auf die Sprünge helfen könnte.

Ach ja, die Fehlermeldung bei 'Fehler Ausstieg:' sagt: 'index == null'. :bahnhof:

Gruß,
Chriz
 
gib zusätzlich per
Code:
e.printStackTrace()
den kompletten StackTrace aus, da steht dann auch die Zeilennr drin in welcher der Fehler auftritt.

Bzgl. der Listeners ist die jButton1MouseClicked (überigens gibt es speziell für Buttons auch ActionListener) wohl der falsche Ort um an die Liste einen LIstener zu hängen. So wird ja bei jedem Drücken des Buttons ein weitere Listeren drangehängt.
So was gehört ausserhalb, z.B. bei der Definition des Layouts, gemacht.

So wie es ausschaut verwendest Du zum Teil einen GUI Editor. Dazu habe ich meine eigene Meinung, aber als Anfänger ist es m.M. nicht verkehrt sich mal ohne solche Hilfsmittel an einer GUI zu versuchen.
 
Danke, Michael, für die Antwort.
Ich habe den Listener in die Hauptklasse gesetzt und voila... es klappt! :applaus:

Jetzt muss ich zwar 2x auf den Button klicken, damit er die Dateiliste aktualisiert, aber da kümmere ich mich heute abend drum 😉

Gruß und Dank,
Chriz
 
Hmm, jedes mal wenn man in deiner Liste herumklickt öffnet sich eine neue Verbindung zu einem FTP server und ein Bild wird runtergeladen? Das klingt nicht gerade optimal. Da wäre es besser EINE Verbindung zu halten, und über die die Daten zu übertragen.
 
Danke für den Hinweis, bERt0r...

am Ablauf gibt es noch einiges zu optimieren. Im Moment bin ich erst einmal froh, dass das Programm überhaupt läuft 😉

Gruß,
Chriz
 

Neue Themen


Zurück
Oben