Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Ich hatte folgendes Problem:
Eine Endlosschleife die von einem JFrame ausgelöst wird blockt die Aktualisierung des Frames.
Lösung: Endloschleife in neuem Thread laufen lassen.
Jetzt habe ich das Problem anders herum: Eine Endlosschleife erstellt einen neuen Frame. Dieser wird nicht richtig angezeigt, selbst wenn ich in einem neuen Thread aufrufe. Wenn ich ihn zum Test auserhalb der schleife aufrufe funktioniert alles.
Auch ohne Code ist dein Problem nachvollziehbar.
Neuer Thread, der den JFrame erstellt ist ja auch nicht der Sinn des seperaten Threads.
Du erstellst dir eine Instanz deines JFrames(diese läuft im EDT).
Die Endlosschleife lässt du in einem seperaten Thread laufen und nur die änderungen an dem GUI werden explizit in die Evetque des EDT übergeben, damit dieser nur das tut, wofür er gedacht ist(Events verarbeiten).
Andernfalls würde ich mich fab anschliessen, nur kopiere dann bitte Zeile 3 in Zeile 10, sonst bekommste ne NullCodeException.
Das ist der Code vereinfacht, aber der Rest ist unwichtig. DatagramSocket und DatagramPacket sind richtig initialisiert, habe ich hier nur rausgelassen. MyFrame ist eine Unterklasse von JFrame. Sobald das Packet mit Inhalt "2" empfangen wird entsteht ein neuer Frame, der allerdings nicht befüllt wird, sonder nur grau ist. MyFrame ist fehlerlos. Packets werden auch richtig empfangen. Daher vermute ich das die Endlosschleife blockt.
startet dein Frame dann richtig oder ist dort auch nur ein graues Fenster ?
... weil wenn ich in einer Testklasse nen Frame erzeuge, der in einer Endlosschleife ist, läuft er ohne Probleme und zeigt alle beinhalteten Komponenten an
Hat es einen speziellen Grund, warum die Erzeugung des Frame nicht dem Dispatcher invoked wird? Ansonst ist der Rest des Codes sicher nicht unwichtig, sonst gäbe es ihm ja nicht.
der rest des quelltextes hat mit dem verbindungsaufbau zu tun und bestimmten anderen funktionen je nachdem, was der inhalt des packets ist. der datenempfang sowie die anderen funktionen funktionieren korrekt.
Das ist der Code vereinfacht, aber der Rest ist unwichtig. DatagramSocket und DatagramPacket sind richtig initialisiert, habe ich hier nur rausgelassen. MyFrame ist eine Unterklasse von JFrame. Sobald das Packet mit Inhalt "2" empfangen wird entsteht ein neuer Frame, der allerdings nicht befüllt wird, sonder nur grau ist. MyFrame ist fehlerlos. Packets werden auch richtig empfangen. Daher vermute ich das die Endlosschleife blockt.
Vermutungen sind ganz schlecher Ratgeber!
Nicht die Schleife blockt irgendwie, sondern die Methode "receive" ist ein blockierender Methodenaufruf. Das ist auch sinnvoll, denn an dieser Stelle soll ja auf das Eintreffen eines neuen UDP-Pakets gewartet werden. Sobald ein UDP-Paket im Eingangspuffer ist, erhält die Methode "receive" ihr "return" und dein Code kann mit der nächsten Anweisung fortfahren.
Da der Aufruf blockt, darf er "nie" als Teil eines "Event-Handlers" implementiert sein oder von einem "Event-Handler" aufgerufen werden. Denn damit blockiert der EDT. vanny hatte das schon gepostet.
Zudem solltest du wie der "subterrane Lavadrache" es bereits geschrieben hat, einen JFrame über den EDT erwecken, z.B. mit "invokelater". Die kritische Methode ist dabei die setVisible-Metode des JFrames . Wird die bereits im Konstrutor deines JFrames benutzt, so muss du folgenden Aufruf starten:
Java:
EventQueue.invokeLater( new Runnable() {
public void run() {
MyFrame mf=new MyFrame();
}
});
Oder wenn nicht, ist das hier auch Thread-sicher:
Java:
MyFrame mf=new MyFrame();
EventQueue.invokeLater( new Runnable() {
public void run() {
MyFrame.setVisible(true);
}
});