Einfacher Timer ;)

mr.willow

Mitglied
Hallo JAVAianer 😉

ich wollte mal "schnell" eine Zeitverzögerung einbinden... und :autsch:

Hatte es so versucht:

label.setText("hallo");
Thread.sleep(2000);
label.setText("tschö!");

Problem: er schreibt erst nichts...dann "tschö!". Vermute dass das "sleep" sogar verhindert, dass hallo zuende in das Label transportiert wird 😀 SCH...!

Jetz twar ich ja schlau *reusper* und habe schon mal gegoogelt. ich muss jetzt nicht irgendw. Klassen definieren um 2 Sekunden zu warten...oder?!?!? 😛ueh:

Hat jemand ein tolles einfaches Beispiel?? 😀

gruß und DANKE !
mr.willow
 
hallo eikeB
DANKE erstmal 🙂

also ne klasse def. ?!
Java:
public class DelayMessage extends Thread {
    @Override public void run() 
  { 
        try {
            Thread.sleep(3000);
        } catch (InterruptedException ex) {
            Logger.getLogger(DelayMessage.class.getName()).log(Level.SEVERE, null, ex);
        }
}}

und da wo die verzögerung stattfidnen soll

Java:
label.setText("hallo");
Thread delTime = new DelayMessage();
            delTime.start();
label.setText("tschö!");

??? :-/
Weil aus der "DelayMessage" hab ich ja keinen zugriff auf "label"...
 
Poste mal deinen ganzen Quellcode.
du musst vermutlich das Label als Klassenvariable/Static deklarieren, damit du darauf "global" zugreifen kannst.
 
hat nicht jemand für das einfache Beispiel eine konkrete Lösung?


Java:
// ..
label.setText("hallo");
Thread.sleep(2000);
label.setText("tschö!");
// ..
 
nochmal danke 😉
aber alles posten ist zu heftig 😀
vermutlich ist das doch so kompliziert ...
Schade 🙁 ich bin in anderen Foren bei anderen Themen ganz oben und kann ich immer schnell begreiflich für alle lösen :/
JAVA ist halt nicht mein Gebiet...
Versuche irgendwas zu basteln... :rtfm:
 
wenn du in deinem Codestück auf label zugreifen kannst. Dann kannst du auch drauf zugreifen wenn du das in nen Thread packst, evtl. musst du label dann final machen.
Poste doch mal deinen Code mit dem eingebauten Thread.
 
DANKE !!! DAS IST DIE LÖSUNG GESEWEN !!! :lol::applaus:
Java:
label.setText("hallo!");

new Thread(new Runnable() { 
   public void run()
 {
   try {
         Thread.sleep(3000);
         } 
 catch (InterruptedException ex) {
         Logger.getLogger(KundenData.class.getName()).log(Level.SEVERE, null, ex);
         }
         label.setText("tschö!");
  }
 }).start();

ach ja und "label" final (oder static?) ... !
 
Im Grunde ist das Thema nicht so einfach wie man denken mag.
1. Man ist einer ActionListener Methode die über einen Button Klick ausgelöst wird.
2. Man setzte ein Label
3. Man wartet 3 Sekunden
4. Man setzt noch ein Label

Wichtig für sauberes Arbeiten mit Swing (korregiert mich wenn ich blödsinn schreiben)
A: swing ist nicht threadsave. Das heißt ich soll Gui Komponenten immer nur in einem Thread verändert. Im EDT (event dispatcher thread)
B: So listener Methoden werden im EDT ausgeführt. Wenn hier gewartet wird, blockiert die GUI = schlecht. Also im EDT nie auf die Datenbank gehn oder sleep aufrufen usw...
C: Bin ich nicht im EDT und will GUI Komponenten muss (bzw sollte) ich das im EDT machen. SwingInvoke later...

Das bedeutet du bist im EDT setzt das Label. Möchtest jetzt warten, darfst das aber nicht im EDT machen also neuen Thread. Sind die 3 sekunden vorbei und willst du das zweite Label setzen musst du das i edt machen mit swing invoke later...

Ganz sauber würde es ungefähr so aussehen...

Java:
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

import java.awt.BorderLayout;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class Test {

	private JFrame frame;

	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				Test window = new Test();
				window.frame.setVisible(true);
			}
		});
	}

	public Test() {
		initialize();
	}

	private void initialize() {
		frame = new JFrame();
		frame.setBounds(100, 100, 200, 100);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		final JLabel label = new JLabel("");
		frame.getContentPane().add(label, BorderLayout.SOUTH);

		JButton btnChange = new JButton("Change");
		btnChange.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				// wir sind im EDT
				System.out.println("Im EDT:" + SwingUtilities.isEventDispatchThread());
				label.setText("Warte...");

				new Thread(new Runnable() {

					@Override
					public void run() {
						System.out.println("nicht im EDT:" + SwingUtilities.isEventDispatchThread());
						try {
							Thread.sleep(3000);
						} catch (InterruptedException e) {
						}
						// fertig... gui komponenten nur im edt.
						SwingUtilities.invokeLater(new Runnable() {
							@Override
							public void run() {
								System.out.println("Im EDT:" + SwingUtilities.isEventDispatchThread());
								label.setText("fertig!");
							}
						});

					}
				}).start();
			}
		});
		frame.getContentPane().add(btnChange, BorderLayout.NORTH);
	}

}
pervers... stimmt das so?

Ich habs schon mal gesagt. Und ich sage es wieder... ich halte swing für eine fehlkonstruktion ;-)
 
Zuletzt bearbeitet:
Meiner Auffassung nach kann die geschilderte Situation so nicht eintreten.

GUI-Aktualisierungen sollten innerhalb des EDT geschehen. (1.)
2. blockiert Thread#sleep den aktuellen Thread (der, in dem der Code ausgeführt wird), aber nicht den EDT.
3. sollte es korrekterweise so sein:

Java:
Runnable doHelloWorld = new Runnable() {
    public void run() {
        System.out.println("Hello World on " + Thread.currentThread());
    }
};

SwingUtilities.invokeLater(doHelloWorld);

System.out.println(Thread.currentThread());
Thread.sleep(2000L);

SwingUtilities.invokeLater(doHelloWorld);

SwingUtilities (Java Platform SE 6)

Causes doRun.run() to be executed asynchronously on the AWT event dispatching thread. This will happen after all pending AWT events have been processed. This method should be used when an application thread needs to update the GUI.

try it 😉
 
na da habe ich ja noch ein paar Diskusionen angeregt 😀 ...
sry 😉
Habe aber ehrlich gesagt nur die Hälfte verstanden 😀 😀
ok..man kann nicht alles wissen...aber lernen 😉

Gruß und DANKE euch ALLEN !!!

mr.willow
 
Auch hier sollte mein altes Tut Abhilfe schaffen.
Ist gaanz einfach gehalten ... Klick
die anderen 3 Parts findest ja dann wohl selbst.

Gruß Vanny
 

Neue Themen


Zurück
Oben