jList updaten während actionPerformed

Mister004

Grünschnabel
Hallo!

Ich bin gerade dabei ein SSH-Tunneling Programm zu schreiben. Darin gibt es einen Connect-Button in dem folgendes ausgeführt wird:

Code:
...sammle Daten für  SSH-Tunnel
try {
                    //neue Session mit JSch aufbauen
                    JSch jsch = new JSch();
                    Session session = jsch.getSession(tempUsername, localIP, localPort);
                    session.setPassword(tempPassword);
                    session.setConfig(config);
                    session.connect();
                    
                    session.setPortForwardingL(tunnelPort, gatewayName, gatewayPort);
                    gateway.setGatewayStatus(Gateway.CONNECT_SUCCESS);
                                        
                } catch (JSchException ex) {
                    execLog.appendText("Verbindung konnte nicht hergestellt werden!\n");
                    gateway.setGatewayStatus(Gateway.CONNECT_FAILURE);
                }

Nun in dieser Zeile wird von meiner Klasse Gateway eine int variable status neu gesetzt
Code:
gateway.setGatewayStatus(Gateway.CONNECT_SUCCESS);

Diese Variable bewirkt, dass ein von mir überarbeiteter CellRenderer für eine jList ein neues Icon in die Zelle der jList macht.

CellRenderer:
Code:
private class IconListRenderer extends DefaultListCellRenderer {

        public IconListRenderer() {};
        
        @Override
        public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {

            JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
            Gateway listValue = (Gateway)value;
            
            ImageIcon icon = null;
            if (listValue.getGatewayStatus() == Gateway.NOTCONNECTED)
                icon = new ImageIcon("resources\\images\\connect_notconnected.png");
            else if (listValue.getGatewayStatus() == Gateway.CONNECT_SUCCESS)
                icon = new ImageIcon("resources\\images\\connect_success.png");
            else if (listValue.getGatewayStatus() == Gateway.CONNECT_FAILURE)
                icon = new ImageIcon("resources\\images\\connect_failure.png");

            label.setIcon(icon);
            return label;
        }
    }

Das Problem ist, dass die Zellen immer erst aktualisiert werden nachdem das Programm außerhalb des actionPerformed ist.
Meine Frage: Wird die GUI eines Programmes prinzipiell während einem actionPerformed nicht aktualisiert? Und wenn doch, wieso bei mir erst danach?

Mfg Mister004
 

sheel

I love Asm
Hi

Genau, die GUI wird (ohne zusätzlichen Programmieraufwand)
nicht parallel gezeichnet.

Wenn das benötigt wird: Threads verwenden.

Gruß
 

Mister004

Grünschnabel
also repaint() oder revalidate() oder was auch immer ist in einem actionPerformed sinnlos?

btw danke für die schnelle Antwort
 

sheel

I love Asm
Naja, sinnlos nicht, aber eben verzögert.

Das Betriebssystem hat für das Fenster quasi eine Liste von Aufgaben, wie
Dem Programm sagen, Taste e wurde gedrückt
Dem Programm sagen, Taste e wurde losgelassen
Dem Programm sagen, Das Fenster wurde auf Koordinaten 100|300 verschoben, dort neuzeichnen
Mausklick auf 400|200
...usw

In Java außert sich das dann durch die ganzen Listener.
Und solange eine actionPerformed oÄ. ausgeführt wird wartet das Betriebssystem.
Wenn der Mausklick oben dein Connectbutton war und der ein Neuzeichnen erzwingt
kommt zur Liste eben "Neuzeichen" dazu. Wird aber erst gemacht,
wenn der Klick fertig abgearbeitet ist.