Frame bleibt schwarz beim Laden

Status
Nicht offen für weitere Antworten.

Johnny00

Mitglied
Hallo liebes Forum,

ich bin auf ein kleines Problem gestoßen.
Ich bin dabei ein Programm zu schreiben, welches Emails versendet.
Das Ganze findet in der Klasse Client statt.
Wenn ich auf den "Senden" Button klicke, soll zeitgleich aber noch ein neuer Frame erscheinen mit einer JProgressBar um den aktuellen Fortschritt anzuzeigen.

Java:
....
// pb enthält Progressbar
        pb.setVisible(true);
        pb.pack();
        bar.setValue(0);
        bar.setStringPainted(true);

        Connection con = new Connection ();
        con.send();
        JOptionPane.showMessageDialog ( ... );
...

so in etwa sieht das Ganze dann aus.
Nun tritt folgendes Problem auf:

Ich klicke auf Senden, mein Frame öffnet sich, aber es bleibt schwarz.
Im Hintergrund wird die Email verschickt.
Am Ende wird mein JOptionPane angezeigt und dann wird auch mein Frame richtig angezeigt mit der JProgressBar.

Wenn ich die Verbindug (Connection) und das Senden also weglasse, wird mein Frame mit der Progressbar korrekt angezeigt.
Sobald ich aber die Verbindung aufbaue und probiere die Email zu senden bleibt mein Frame schwarz,
und wird dann erst richtig sichtbar nachdem meine Email verschickt wurde (die Verbindung beendet wurde).

Wieso ist das so, und wie kann ich diesen "Bug" beheben, sodass erst mein Frame korrekt angezeigt wird und im Hintergrund meine Nachricht verschickt wird?
Ich denke dafür muss ich eine der beiden Prozesse als Thread parallel laufen lassen.. hab ich auch probiert nur mein Frame bleibt immernoch Schwarz ???:L ???:L

Wäre nett wenn ihr mir helfen könntet !!

Mit freundlichem Gruß
Johnny
 
Zuletzt bearbeitet:
setVisible muss nach pack() und den Modifikation an bar aufgerufen werden. Möglicherweise löst dies das Problem aber noch nicht. Wird dieses Code Fragment von einem ActionListener, der an einen Button angehängt ist ausgeführt?
 
Also wenn ich setVisible() nach pack() aufrufe, dann bleibt mein JFrame weiß..
und wie üblich nachdem die Connection beendet wurde wird mein JFrame ganz normal mit der ProgressBar angezeigt.

Hier kann man das Szenario beobachten:

1. Ich klicke auf Send



2. Connection wurde aufgeführt



3. Dialog von Connection geschlossen



Ja genau, ich habe ein JFrame mit meinen ganzen Elementen,
und das Fragment wird ausgeführt nachem ich auf den Senden Button klicke.. in dem Fall:

Java:
    private void sendActionPerformed(java.awt.event.ActionEvent evt) {
        send.setEnabled (false);
        error = -1;

        //new Loaded (this).start();
        bar.setValue(0);
        bar.setStringPainted(true);
   
        pb.pack();
        pb.setVisible(true);

        Connection con = new Connection ( );
        con.run(); // Senden der Email
        con = null; // 
    ...
}
(Netbeans 😛)

Ich bin echt ratlos .. :/
 
versuch es mal mit:
Java:
SwingUtilities.invokeLater(new Runnable() {
	public void run() {
		Connection con = new Connection ( );
        con.run(); // Senden der Email
        con = null; // 
	}
});
 
hmm sehr merkwürdig.. mein Connection objekt hat ja noch einige lokale variablen als parameter,
aber wenn ich das in nem runnable packe kommt sofort die meldung "Email konnte nicht verschickt werden"

Java:
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                Connection con = new Connection ( Client.this, Client.this.obj, Client.this.email );
                con.run ();
                con = null;
            }
        });

       if (error == -2) // Email Erfolgreich
       else // Fehler

Mein Objekt Connection greift auf meine lokale error Variable im Client.
Wenn error auf -2 gesetzt wird nach der Senderoutine, dann sieht das man Client und weiß, dass die Email erfolgreich verschickt wurde. Das Problem ist aber wenn ich das mit dem Runnable mache, bleibt mein error immer auf -1, also standardwert.. gibts da irgendwelche probleme mit den Referenzen?? Kann meine Connection nicht auf Client.this zugreifen??
 
Nein es hilft alles nichts .. mein Connection will sich nicht verbinden.
Normalerweise wenn ich auf senden klicke dann braucht er erstmal einige Sekunden um sich zum Server zu verbinden
nun spuckt der mir aber sofort ne fehlermeldung raus.

Ich habe auch probiert meine Objekte obj und email als globale Vairbalen zu deklarieren und dann mittels getter methoden an connection zu übergeben.. also in dem fall:

Java:
    public Connection ( Client main ) {
        this.main   = main;
        this.obj = main.getObj();
        this.email = main.getMail();
        ....
        this.initialize ();
    }

..klappt aber trotzdem nicht .. ich bin echt ratlos ...
 
Ich wusste nicht, dass da noch mehr kommt ^^
Das SwingUtilities.invokeLater fügt einen neuen Job an die EventQueue an, die dann später abgearbeitet wird. Alles, was mit dem Email-Versenden zu tun hat, müsste da rein. Ich denke nämlich, dass das Email-Versenden etwas lange dauert und deine GUI in dieser Zeit schwarz bleibt. Wenn du den Job aber zu hinterst an die Queue anhängst, dann kann die GUI bereits gezeichnet werden und danach wird die Email versendet.
Eine mögliche Alternative wäre es, kein SwingUtilities zu verwenden aber das setVisible noch weiter hinten, nach all den Befehlen für das Versenden hinzusetzen. Dann müsstest du einfach warten, bis das Versenden abgearbeitet ist, bevor das Fenster angezeigt wird, dafür sollte es dann flüssig funktionieren.
 
Yes, es hat geklappt 🙂

Ja du hast recht, dort musste alles rein, was mit dem Email versenden zu tun hat..
ich hab das jetzt so gemacht:

Java:
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                Connection con = new Connection ( Client.this, Client.this.obj, Client.this.email );
                con.run ();
                con = null;

                if (error == -2) // Email Erfolgreich
                else // Fehler
            }
        });

und es klappt einwandfrei !
Danke dir 😀
 
Naja, soooo produktiv sind die beiden Zeilen ja jetzt nicht, aber ich gehe mal davon aus, dass du da schon noch was dazwischen flickst 😉

Gern geschehen.
 
Hehe ja ich habs alles fertig, nur ein Problem besteht... jetzt wird meine ProgressBar nicht aktualisiert.
Ich baue das SMTP Protokoll auf in Connection und nach jedem Teilschritt will ich die Progressbar z.b. um 5% erhöhen.
Dazu rufe ich dann die Methode:

Java:
    public void setProgressStatus (int val) {
        this.bar.setValue (val);
    }
auf im Client. Die Anziege wird aber nicht geupdated. Erst am Ende nachdem das Senden ausgeführt wurde wird meine Bar geupdated. Kannst du mir bitte noch ein letztes mal helfen?? Du hast mir eig. schon mehr als genug geholfen.. aber wär cool wenn du auch hier weiter rat wüsstest..
 
Vielleicht klappt es so:
Anstatt SwingUtilities.invo.... schreibst du:
Java:
       new Thread() {
            public void run() {
                Connection con = new Connection ( Client.this, Client.this.obj, Client.this.email );
                con.run ();
                con = null;
 
                if (error == -2) // Email Erfolgreich
                else // Fehler
            }
        }.start();

Wenn das nicht geht, dann schreibst du das da oben in die SwingUtilities.invokeLater(new Runnable { public void run() { ... } } ); hinein. Aber ich hoffe, das erste funktioniert bereits.
 
Oh man.. ich hab mein code so aufgepusht. Hab SwingUtilities und den Thread benutzt und nun klappts.. ENDLICH 😀

Danke vielmals 🙂)
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben