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.
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:
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.
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 ;-)
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);
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.
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