-
Hallo,
ich habe gerade an einem kleinen Programm geschrieben. Es geht dabei um ein Frame, welches verädert (vergößert, um genau zu sein) werden soll, sobald es sichtbar ist. Dazu wird einfach ein Thread gestartet, der ununterbrochen überprüt, ob das Frame schon sichtbar ist. Hier erstmal der vereinfachte Code:
Der Code funktioniert jedoch nicht, das Frame hat die Größe 0x0. Wenn ich jetzt aber in die Schleife die FunktionCode java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
public class Test { static final JFrame frame; static { frame = new JFrame("Hallo"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setResizable(false); frame.setLocationRelativeTo(null); setSize(300, 200); } public static void main(String[] args) { frame.setVisible(true); } private static void setSize(final int width, final int height) { if (frame.isVisible()) { frame.setSize(width, height); frame.setLocationRelativeTo(null); } else { new Thread(){ public void run() { // Hier ist jetzt die Abfrage... while (!frame.isVisible()) { // Leere Schleife, die verlassen werden soll, // sobald das Frame sichtbar ist. } setSize(width, height); } }.start(); } } }
schribe, dann funktioniert es einwandfrei! Hab ich da jetzt echt einen verrückten Denkfehler oder liegt das an Java? Vielleicht habt ihr ja eine Idee...Code java:1
System.out.println();
Grüße CymatoxaGeändert von Cymatoxa (08.01.12 um 23:26 Uhr) Grund: Rechtschribung
-
Hi,
Ich habe das Programm bei mir getestet und es funktioniert ohne das ich System.out.println() schreiben musste.
Gruß
G1n0Geändert von G1n0 0n3 (09.01.12 um 00:02 Uhr)
-
Nein, nein.
Das Fenster soll duch frame.setSize(300, 200); auf die entsprechende Größe gebracht werden.
Mich interessiert vor allem, wie es kommt, dass der Befehl System.out.println(); innerhalb meiner Schleife dafür sorgt, dass das auch geschieht, sobald frame.setVisible(true); aufgerufen wurde. Wie ich dieses "Problem" umgehen kann ist mir weniger wichtig - dafür habe ich bereits genug Ansätze.
Grüße, Cymatoxa
EDIT: Funktioniert das Programm bei euch auch mit leerer Schleife?
-
Hi,
hab auch schon mein Beitrag geändert. Ich habe dich erstmal falsch verstanden sry
Ja, es funktioniert bei mir auch mit einer leeren Schleife
Gruß
G1n0
-
verrück... danke, werde mal meine Java Version aktuallisieren
Grüße,
Cymatoxa
Echt seltsam... Auch mit der aktuellen Java Version hab ich mit leerer Schleife nur ein winziges JFrame. Kann das an NetBeans liegen? Wohl kaum, oder?
Grüße CymatoxaGeändert von sheel (09.01.12 um 02:01 Uhr) Grund: Doppel
-
Guten Abend.
Ok habs mal bei mir getestet und auch bei mir funktionierts danach...
Die Lösung würde mich jetzt wirklich mal interessieren!
Gruß MirarGeändert von Mirar (09.01.12 um 00:27 Uhr)
Man kann niemanden überholen, wenn man in seine Fußstapfen tritt...
-
xD ohne das System.out.println() gehts bei dir auch nicht?
-
Hi,
kann man auf der seite irgendwie ein Bild hochladen****?
Ich habe ein screenshot gemacht und würde es dir gerne zeigen...
Bei mir klappt es ohne das System.out.println();
Gruß
G1n0
-
http://www.directupload.net/
glaub ich dir aber auch so... ich kanns nur nicht begreifen
-
http://s7.directupload.net/file/d/2764/v9fc9h6h_jpg.htm
In der Schleife steht kein System.out.println() und es zeigt mir das Fenster trotzdem.Geändert von sheel (09.01.12 um 02:02 Uhr) Grund: Doppel
-
Bilderupload: Erweitert Antworten - Büroklammersymbol
Und bitte keine Doppelposts hintereinander vom gleichen User.
Man kann Beiträge doch bearbeiten.
PS: Bei mir funktioniert es auch ohne println...hm...Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
-
09.01.12 09:26 #12
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.
Und bei mir funktioniert es auch mit println nicht...
Swing ist nicht thread-sicher. Falls man Methoden von einem anderen Thread als dem Swing Event Dispatch Thread aufruft, riskiert man Thread-Interferenz bzw. Speicherkonsistenzprobleme.
Was ist denn das ursprüngliche Problem was du mit dem Einsatz des Threads lösen willst? Funktioniert es denn nicht wenn du setSize aufrufst auch wenn der Frame noch nicht sichtbar ist?
Warum verwendest du nicht einen WindowListener / WindowAdapter? (windowOpened)
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Hallo,
mein Problem ist etwas komplexer und hat sich theoretisch bereits - durch einen kompletten Umbau - erledigt. Allerdings rätsel ich immernoch, warum diese "Phänomen" auftritt. An den Swing- bzw. ATW-Threads liegt es nicht, es ist selbst mit einem boolean flag das gleiche:
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
public class WTF { static boolean condition = true; private static void foo(final int width, final int height) { System.out.println("Funktion aufgerufen"); if (! condition) { System.out.println("Funktion ausgeführt"); } else { new Thread() { public void run() { System.out.println("Schleife betreten"); while (condition) { // System.out.println("Schleife..."); } System.out.println("Schleife verlassen"); foo(width, height); System.out.println("Thread beendet"); } }.start(); } } public static void main(String[] args) throws InterruptedException { foo(300, 200); Thread.sleep(5); condition = false; System.out.println("Variable geandert [condition=false]"); } }
Das Programm gibt nur ausund bleibt dann in der Schleife hängen (jedenfalls, wenn System.out.println("Schleife..."); auskommentiert bleibt).Code :1 2 3
Funktion aufgerufen Schleife betreten Variable geandert [condition=false]
Ich denke mal, dass der compiler den Wert in der Schleife aus performancegründen zwischenspeichert und nicht aktualisiert... Kann das sein? ô.O Ich kenn mich da nicht sonderlich aus...
Danke jedenfalls an euch alle, dass ihr euch für mein Problem die Zeit genommen habt. Vielleicht habt ihr ja noch eine Idee...?
Grüße,
Cymatoxa
-
Das mit den Kompileroptimierungen ist möglich...
das Hauptproblem an deinem boolean ist aber die fehlende Threadsicherheit.
Du machst die Swing-Unzulänglichkeit kein Stück besser,
wenn du ein genau so problematisches bool noch dazu machst.
synchronized-Zugriff wäre schon eher was.Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
-
09.01.12 16:36 #15
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Du müßtest volatile verwenden:
GrußCode java:1
static volatile boolean condition = true;
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
Ähnliche Themen
-
PHP/MySQL: Denkfehler, oder gehts einfach nicht?!
Von Kristian- im Forum PHPAntworten: 2Letzter Beitrag: 24.08.10, 20:46 -
blöder Fehler im Script oder denkfehler von mir?
Von ts230 im Forum Javascript & AjaxAntworten: 4Letzter Beitrag: 13.05.08, 09:03 -
SUM() funktioniert nicht.. oder doch Denkfehler?
Von Immi im Forum Relationale DatenbanksystemeAntworten: 4Letzter Beitrag: 11.02.08, 13:39 -
Denkfehler oder IE Bug?
Von tobee im Forum Javascript & AjaxAntworten: 9Letzter Beitrag: 06.07.06, 16:24 -
denkfehler?
Von Firefighter 1966 im Forum C/C++Antworten: 4Letzter Beitrag: 22.12.04, 19:30



3Danke

Zitieren

Login





