# fenster im thread aktualisieren



## bummerland (15. Jul 2003)

Ich hab ein Dialogfenster und das möchte ich alle 0.5 Sekunden aktualisieren, sprich z.B. ein Label darin ändern. Ich bekomm das irgendwie nicht hin, er zeigt das fenster erst an, wenn er fertig ist.
Hat jemand ne Idee?


----------



## Nadja (15. Jul 2003)

Hmm, ich glaube Du mußt das Fenster neu 'malen' wenn Du was veränderst... Kann es sein, daß Du das erst machst wenn er fertig ist? Frag mich aber bitte nicht wie die Methode heißt, daß weiß ich leider nicht... :?

Ansonsten, zeig doch mal ein bißchen Code. Vielleicht kann man da noh was drin finden...


----------



## DTR (15. Jul 2003)

Das aktualisieren muss in einem anderen Thread liegen als der Hauptteil des Programmes. Schau dir mal die Klasse Timer an, die könnte eine recht einfache Lösung für das Problem bieten, ohne einen Eigenen Thread anlegen zu müssen.

@Nadja die Methode heißt repaint()


----------



## bummerland (15. Jul 2003)

ok, ich habs so versucht, aber das geht auch nicht. 

```
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;


public class SpielDialog extends JDialog
{
	Team home;
	Team guest;
	int painted = 0;
	JLabel lab;
	Timer timer;
	
	public SpielDialog(Frame f, Team h, Team g)
	{
		super(f, "Spiel", true);
		home = h;
		guest = g;
		getContentPane().setLayout(new BorderLayout());
		setSize(300,100);
		setResizable(false);
		lab = new JLabel("Start");
		getContentPane().add(lab, BorderLayout.CENTER);
		setVisible(true);		
		timer = new Timer(50, new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				minute();
				
			}
		});
		Msg.print("Timer startet...");
		timer.start(); 
		repaint();
		
		
		
	}
	
	public void minute()
	{
		painted++;
		Msg.print("" + painted + " Mal");	
		lab.setText("" + painted + " . Minute");
		if (painted > 90)
		{
			Msg.print("Timer stoppt.");
			timer.stop(); 
		} 
		this.repaint();
	}
}
```


----------



## DTR (15. Jul 2003)

Wird der Timer überhaupt aufgerufen? Bekommst du als deine Ausgabe? Vieleicht ist er auch nur zu schnell. Du hast für die Zeit 50 angegeben. Das sind in der Regel 0,05 sec. Deine 0,5 sec entsprechen 500.


----------



## Nobody (15. Jul 2003)

du könntest den thread während des vorgangs in einer endlosschleife laufen lassen und nach der aktualisierung ein thread.sleep aktivieren
also so in etwa:


```
//in der variablen dekleration, muss von dem thread und der andere methode aus aufrubar sein
boolean fertig=false;
//im thread
while(fertg==false){
//aktualisierens quelltext
Thread.sleep(50);}
   catch (Exception e){}
}
```

habs nur mal so grob angerissen 
der thread.sleep geht immer auch wenn runnable nicht implantiert wurde


----------



## bummerland (16. Jul 2003)

der timer wird komischerweise erst aufgerufen, wenn das Fenster geschlossen wird.


----------



## DTR (16. Jul 2003)

Versuch mal den Timer zu starten, bevor du das Fenster sichtbar machst.


----------



## bummerland (16. Jul 2003)

hab das problem jetzt gelöst. ein thread aktualisiert das fenster jetzt. nur hab ich nun ein nächstes problem: das funktioniert nur mit frames bzw. windows aber nicht mit dialogen.


----------



## DTR (16. Jul 2003)

Das kann eigendlich nicht sein, ein Dialog ist von Window abgeleitet. Wenn es mit Window geht, muss es auch mit dialog gehen.


----------



## bummerland (16. Jul 2003)

wenn der dialog modal ist, dann gehts nicht, wenn er nicht modal ist, funktioniert es. Komisch


----------



## DTR (17. Jul 2003)

Eigendlich ist das ja klar, hätte ich dran denken müssen  Wenn der Dialog Modal ist, wir alles andere angehalten und nur der Dialog wird weiter abgearbeitet. Muss er denn Modal sein? Wenn ja warum?


----------



## bummerland (17. Jul 2003)

ohne dass er modal ist, geht es auch. ich dachte erst, dass er modal sein müsste, um immer im vordergrund zu bleiben.

weiß jemand, wie ich den Schliessen-Button (das X) wegbekomme?


----------



## DTR (18. Jul 2003)

Unter 1.4 gibt es eine Methode die dir den Rahmen und alles abstellt, was das OS Zeichnet. Ich weiß aber nicht mehr wie die heißt. Schau mal in der API nach. Ansonsten kannst du mit setDefaultCloseOperation das x auch wirkungslos machen, fals das hilft.


----------

