tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
JA
ANTWORTEN
17
ZUGRIFFE
586
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Cymatoxa Cymatoxa ist offline Mitglied Silber
    Registriert seit
    Jul 2010
    Beiträge
    67
    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:
    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
    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();
            }
        }
    }
    Der Code funktioniert jedoch nicht, das Frame hat die Größe 0x0. Wenn ich jetzt aber in die Schleife die Funktion
    Code java:
    1
    
    System.out.println();
    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...

    Grüße Cymatoxa
    Geändert von Cymatoxa (08.01.12 um 23:26 Uhr) Grund: Rechtschribung
     

  2. #2
    G1n0 0n3 G1n0 0n3 ist offline Mitglied Bronze
    Registriert seit
    Aug 2011
    Beiträge
    32
    Hi,

    Ich habe das Programm bei mir getestet und es funktioniert ohne das ich System.out.println() schreiben musste.

    Gruß
    G1n0
    Geändert von G1n0 0n3 (09.01.12 um 00:02 Uhr)
     

  3. #3
    Cymatoxa Cymatoxa ist offline Mitglied Silber
    Registriert seit
    Jul 2010
    Beiträge
    67
    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?
     

  4. #4
    G1n0 0n3 G1n0 0n3 ist offline Mitglied Bronze
    Registriert seit
    Aug 2011
    Beiträge
    32
    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
     

  5. #5
    Cymatoxa Cymatoxa ist offline Mitglied Silber
    Registriert seit
    Jul 2010
    Beiträge
    67
    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 Cymatoxa
    Geändert von sheel (09.01.12 um 02:01 Uhr) Grund: Doppel
     

  6. #6
    Avatar von Mirar
    Mirar Mirar ist offline Mitglied
    Registriert seit
    Oct 2011
    Beiträge
    20
    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ß Mirar
    Geändert von Mirar (09.01.12 um 00:27 Uhr)
     
    Man kann niemanden überholen, wenn man in seine Fußstapfen tritt...

  7. #7
    Cymatoxa Cymatoxa ist offline Mitglied Silber
    Registriert seit
    Jul 2010
    Beiträge
    67
    xD ohne das System.out.println() gehts bei dir auch nicht?
     

  8. #8
    G1n0 0n3 G1n0 0n3 ist offline Mitglied Bronze
    Registriert seit
    Aug 2011
    Beiträge
    32
    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
     

  9. #9
    Cymatoxa Cymatoxa ist offline Mitglied Silber
    Registriert seit
    Jul 2010
    Beiträge
    67
    http://www.directupload.net/

    glaub ich dir aber auch so... ich kanns nur nicht begreifen
     

  10. #10
    G1n0 0n3 G1n0 0n3 ist offline Mitglied Bronze
    Registriert seit
    Aug 2011
    Beiträge
    32
    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
     

  11. #11
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.503
    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, ...?

  12. #12
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    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.

  13. #13
    Cymatoxa Cymatoxa ist offline Mitglied Silber
    Registriert seit
    Jul 2010
    Beiträge
    67
    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 aus
    Code :
    1
    2
    3
    
    Funktion aufgerufen
    Schleife betreten
    Variable geandert [condition=false]
    und bleibt dann in der Schleife hängen (jedenfalls, wenn System.out.println("Schleife..."); auskommentiert bleibt).
    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
     

  14. #14
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.503
    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, ...?

  15. #15
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Du müßtest volatile verwenden:
    Code java:
    1
    
    static volatile boolean condition = true;
    Gruß
    Cymatoxa bedankt sich. 
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

Ähnliche Themen

  1. Antworten: 2
    Letzter Beitrag: 24.08.10, 20:46
  2. blöder Fehler im Script oder denkfehler von mir?
    Von ts230 im Forum Javascript & Ajax
    Antworten: 4
    Letzter Beitrag: 13.05.08, 09:03
  3. SUM() funktioniert nicht.. oder doch Denkfehler?
    Von Immi im Forum Relationale Datenbanksysteme
    Antworten: 4
    Letzter Beitrag: 11.02.08, 13:39
  4. Denkfehler oder IE Bug?
    Von tobee im Forum Javascript & Ajax
    Antworten: 9
    Letzter Beitrag: 06.07.06, 16:24
  5. denkfehler?
    Von Firefighter 1966 im Forum C/C++
    Antworten: 4
    Letzter Beitrag: 22.12.04, 19:30