Keine sequentielle Abarbeitung?

usafnetworx

Grünschnabel
Hallo liebe Tutorials.de Gemeinde.

Ich habe mich entschlossen, meine Frage hier zu stellen, vielleicht kann mir einer folgendes Phänomen erklären:

In meinem Java-Programm habe ich einen Connect Button. Wenn dieser betätigt wird, soll auf der einen Seite natürlich verbunden werden, auf der anderen Seite dieser Button aber für die Durchlaufzeit der Funktion deaktiviert werden. Darüber hinaus soll ein Label (bitte warten..) eingeblendet werden und nach jedem Zwischenschritt des Verbindens ein Eintrag ins Logeintrag (TextArea) gemacht werden.

Soweit ist ja alles klar. Aber wenn der Button nun gedrückt wird, fängt das Programm gleich an mit dem Verbinden. Das heißt, der Button wird nicht sofort inaktiv, das Label erscheint nicht sofort etc. Das Programm steht für die Zeit des Verbindungsaufbaus,
obwohl die Methodenaufrufe für die Verbindungsherstellung erst nach den Anweisungen für Button, Label etc. im Code sind.

Hier ein Auszug aus dem Code:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
jLabel7.setVisible(true); /Bitte warten.. Label
if (!connectionOk) {
jTextArea1.setText("");
}
statusMessageLabel.setText("Verbindungsaufbau gestartet..");
log("Verbindungsaufbau gestartet..");
jButton1.setEnabled(false);
HttpUnitOptions.setExceptionsThrownOnScriptError( false );

/* DER OBIGE CODE WIRD MEINES ERACHTENS SCHON ZUVOR AUSGEFÜHRT, ABER MAN BEKOMMT DAVON NICHTS MIT, ERST NACHDEM DER FOLGENDE METHODENAUFRUF FERTIG IST! */

try {
NotencheckerView.getConnection(NotencheckerView.jTextField2.getText());
} catch (Exception ex) {
NotencheckerView.log("Fehler beim Verbindungsaufbau!");
NotencheckerView.log("Login-Daten nicht korrekt?");
NotencheckerView.connectionOk=false;
}


Warum ist dies so? Kann man eine strikt sequentielle Abarbeitung erzwingen?

Gruß
der Neuling
 
Tut es doch. Aber der Listener wird im Hauptthread aufgerufen, weshalb wärend der Inhalt abgearbeitet wird der Hauptthread keine Zeit hat, die GUI neu zu zeichnen. Um das so hinzubekommen musst du einen neuen Thread starten, der diese Änderungen vornimmt.

Ich würde eine Class machen, die von Thread erbt und ActionListener implementiert.
In der actionPerformed(ActionEvent) nur "new Thread(this).start();", die void run überschreiben und darein die Änderungen und eine Instanz davon beim Button registrieren.
 
Ich würde eine Class machen, die von Thread erbt und ActionListener implementiert.
In der actionPerformed(ActionEvent) nur "new Thread(this).start();", die void run überschreiben und darein die Änderungen und eine Instanz davon beim Button registrieren.

Vielen Dank für deine sehr schnelle Antwort! Leider ist mir noch nicht ganz klar, wie das funktioniert.

Ersteller Code:

class BLUB extends Thread implements ActionListener {

@Override public void run() {
System.out.println("IN THREAD");
NotencheckerView.jLabel7.setVisible(true);
}

/* Nachfolgender Code wurde von Netbeans automatisch erzeugt */

public void actionPerformed(ActionEvent e) {
throw new UnsupportedOperationException("Not supported yet.");
}
}

Die Meldung "IN THREAD" erscheint, aber das jLabel bleibt unsichtbar. Es ist public static.

Die actionPerformed im Hauptprozess hab ich mal auf folgendes reduziert:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
new BLUB().start();
}
 
Versuch mal das JFrame zusätzlich zu repainten.
setVisible macht bei mir öfters Probleme, deshalb nutze ich i. d. R. nur add/remove. Bei remove muss man btw. auch repainten, bei add nicht.
 

Neue Beiträge

Zurück