Java Thread.sleep

Diskutiere Java Thread.sleep im Developer Network Forum im Bereich Hardware & Software Forum; Moin ein Kumpel hat ein kleines Problem... daher kann es etwas dauern bis ich schreibe falls es noch fragen geben sollte import java.awt.*...
  • Java Thread.sleep Beitrag #1
D3athSØul

D3athSØul

Bekanntes Mitglied
Dabei seit
05.01.2009
Beiträge
366
Reaktionspunkte
0
Ort
127.0.0.1
Moin ein Kumpel hat ein kleines Problem... daher kann es etwas dauern bis ich schreibe falls es noch fragen geben sollte

Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;


public class bge extends JFrame {
  private JTextArea jTextArea1 = new JTextArea("");


  public bge(String title) {
    // Frame-Initialisierung
    super(title);
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    int frameWidth = 566;
    int frameHeight = 433;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    Container cp = getContentPane();
    cp.setLayout(null);

    jTextArea1.setText("text1");
    jTextArea1.setBounds(8, 8, 409, 385);
    cp.add(jTextArea1);

    langsamer(2000);

    jTextArea1.setText("text2");

    setResizable(false);
    setVisible(true);
  }

  
     private void langsamer(int ms)
     {
       try
        {
            Thread.currentThread().sleep(ms);
        }
        catch(InterruptedException e)
        {
            System.err.println("Error...");
        }
    }

  public static void main(String[] args) {
    new bge("bge");
  }
}

Code:
    jTextArea1.setText("text1");
    jTextArea1.setBounds(8, 8, 409, 385);
    cp.add(jTextArea1);

    langsamer(2000);

    jTextArea1.setText("text2");

    setResizable(false);
    setVisible(true);
  }

  
     private void langsamer(int ms)
     {
       try
        {
            Thread.currentThread().sleep(ms);
        }

Das Problem hierbei ist, es gibt nicht erst "text1" aus und wartet dann 2 sek bis er "text2" ausgibt, sondern wartet erst 2s und gibt dann beides gleichzeitig aus, bzw. es wartet 2 sek. bis es überhaupt etwas tut!


Mfg
 
  • Java Thread.sleep Beitrag #2
T

TrµMAn

Bekanntes Mitglied
Dabei seit
23.10.2006
Beiträge
4.882
Reaktionspunkte
2
Ort
Wuppertal
darf ich mal blind, ohne Ahnung von Java raten?

Könnte es am
Code:
setVisible(true);
liegen, dass erst nach
Code:
jTextArea1.setText("text2");
ausgeführt wird?
 
  • Java Thread.sleep Beitrag #3
D3athSØul

D3athSØul

Bekanntes Mitglied
Dabei seit
05.01.2009
Beiträge
366
Reaktionspunkte
0
Ort
127.0.0.1
darf ich mal blind, ohne Ahnung von Java raten?

Könnte es am
Code:
setVisible(true);
liegen, dass erst nach
Code:
jTextArea1.setText("text2");
ausgeführt wird?

Ja du darfst raten :)

Ich zitiere Wörtlich
ich hab die ganzen befehle in meinem programm(zum beschreiben der textarea) in ner methode untergebracht, die erst beim drücken eines buttons ausgeführt wird...somit steht da des setVisible(true); vor der methode
 
  • Java Thread.sleep Beitrag #6
the ubm

the ubm

Senior Moderator
Dabei seit
29.05.2005
Beiträge
9.464
Reaktionspunkte
1
Ich tippe mal, dass erst setVisible(true); aufgerufen werden muss. Dann wird das Element geändert und anschließend ein repaint oder so ausgeführt.
catch(InterruptedException e)
{
System.err.println("Error...");
}
Da würde ich schreiben e.printStackTrace(), weiß doch sonst kein Mensch wo der Fehler auftrat.
 
  • Java Thread.sleep Beitrag #7
T

TrµMAn

Bekanntes Mitglied
Dabei seit
23.10.2006
Beiträge
4.882
Reaktionspunkte
2
Ort
Wuppertal
ich habs nochmal ausprobiert, eben in den Onlinecompiler geworfen und genau das, was ich von anfang an sagte (und worin the ubm mich bekräftigt hat), das setVisible(true); muss unmittelbar VOR die Ausgabe von "text1"

also einfach so:
Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;


public class bge extends JFrame {
  private JTextArea jTextArea1 = new JTextArea("");


  public bge(String title) {
    // Frame-Initialisierung
    super(title);
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    int frameWidth = 566;
    int frameHeight = 433;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    Container cp = getContentPane();
    cp.setLayout(null);

    jTextArea1.setText("text1");
    jTextArea1.setBounds(8, 8, 409, 385);
    [U]setVisible(true);[/U]
    cp.add(jTextArea1);

    langsamer(2000);

    jTextArea1.setText("text2");

    setResizable(false);
  }

  
     private void langsamer(int ms)
     {
       try
        {
            Thread.currentThread().sleep(ms);
        }
        catch(InterruptedException e)
        {
            System.err.println("Error...");
        }
    }

  public static void main(String[] args) {
    new bge("bge");
  }
}

Grund warum das jetzt funktioniert: das Fenster wird erst NACH setVisible(true); gezeichnet! Wenn wir aber bevor es gezeichnet wird, den Text von jTextArea1 ändern, wird der ursprüngliche Text nicht angezeigt, da das Fenster noch garnicht dargestellt wird.
 
  • Java Thread.sleep Beitrag #8
D3athSØul

D3athSØul

Bekanntes Mitglied
Dabei seit
05.01.2009
Beiträge
366
Reaktionspunkte
0
Ort
127.0.0.1
Erstma danke TrµMAn für dein Hilfe trotz mangelnder Java kenntnisse. Bin ich wenigsten nicht allein. :) Laut seiner Aussage hat das nicht funktioniert. Er hat allerdings ein wenig am dem Programm "rumgebastelt" und jetzt funktioniert es zwar nicht mit seinem gewollten "sleep" aber es geht.

Mfg
 
  • Java Thread.sleep Beitrag #9
fox99

fox99

Bekanntes Mitglied
Dabei seit
27.11.1999
Beiträge
3.948
Reaktionspunkte
27
Ort
Omicron Persei 8
ich weiss jetzt wie genau das java macht, aber es könnte sein, das erstmal alle schreib und zeichenbefehle für die gui gesammelt werden, und dann wenn zeit ist, alles auf einmal gemacht wird.

wann ist zeit? wenn der hauptthread keine benutzerfunktion ausführt. mit sleep hälst du aber deine nur funktion an, bist immer noch da drin. du hast denke ich 2 möglichkeiten:
- ein neuzeichnen erzwingen (paint, invalidate, oder so ähnlich)
- mit threads arbeiten, so das der hauptthread sich um die gui kümmern kann.
 
  • Java Thread.sleep Beitrag #10
T

TrµMAn

Bekanntes Mitglied
Dabei seit
23.10.2006
Beiträge
4.882
Reaktionspunkte
2
Ort
Wuppertal
ich weiss jetzt wie genau das java macht, aber es könnte sein, das erstmal alle schreib und zeichenbefehle für die gui gesammelt werden, und dann wenn zeit ist, alles auf einmal gemacht wird.

wann ist zeit? wenn der hauptthread keine benutzerfunktion ausführt. mit sleep hälst du aber deine nur funktion an, bist immer noch da drin. du hast denke ich 2 möglichkeiten:
- ein neuzeichnen erzwingen (paint, invalidate, oder so ähnlich)
- mit threads arbeiten, so das der hauptthread sich um die gui kümmern kann.

Oder wir setzen, wie von mir vorgeschlagen, die Sichtbarkeit des Fensters auf true BEVOR die Wartezeit anfängt.

der von mir gepostete Code funktioniert (bei mir) schließlich einwandfrei.

Ich weiß allerdings nicht, worin das ganze nun eingebunden wird und ob sich das nochmal darauf auswirkt. Ich hab nur den Code hier genommen und mal ausführen lassen.
 
Thema:

Java Thread.sleep

ANGEBOTE & SPONSOREN

https://www.mofapower.de/

Statistik des Forums

Themen
213.180
Beiträge
1.579.174
Mitglieder
55.879
Neuestes Mitglied
stonetreck
Oben