# gui friert ein



## reto (26. Mrz 2008)

hallo
ich habe einen frame auf dem ein jcomponent sitzt auf dem etwas animiert werden soll. klappt eigentlich alles wunderbar nur sitzt darüber noch ein jdialog und wenn ich den zu schnell beweg oder sonst was mach dann friert manchmal einfach die ganze gui. hab natürlich hier schon bisschen rumgesucht und hab herausgefunden das swing nich thread sicher ist jedoch die funktion repaint() schon also dürfte das doch kein problem sein.
hier mal ein paar code ausschnitte

```
public void paint( Graphics g ) { 
		Graphics2D g2 = (Graphics2D) g; 
		g2.setRenderingHint( RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
		g2.translate(g2.getClip().getBounds().width/2, g2.getClip().getBounds().height/2);
		g2.scale(Zoom/100.0,Zoom/100.0);
		g2.setColor(Color.WHITE);
		g2.fill(g2.getClip());   //weisser Hintergrund
		g2.setColor(Color.gray);//farbe grau

		int k = g2.getClip().getBounds().width/400;
		int n=1;
		for (int i=0;i<=g2.getClip().getBounds().width/2;i=i+k*10){
			g2.drawLine(i, -g2.getClip().getBounds().height/2, i, g2.getClip().getBounds().height/2);
			n++;
			if (n%3==0){
			Font f = new Font(null, Font.PLAIN,900/Feld.drawArea.Zoom );
			AttributedString as = new AttributedString(String.valueOf(i/100.0));
			as.addAttribute( TextAttribute.FONT, f );
			g2.drawString(as.getIterator(), i, 0);
			}

		}
		n=1;
		for (int i=0;i>=-g2.getClip().getBounds().width/2;i=i-k*10){
			g2.drawLine(i, -g2.getClip().getBounds().height/2, i, g2.getClip().getBounds().height/2);
			n++;
			if (n%3==0){
			Font f = new Font(null, Font.PLAIN,900/Feld.drawArea.Zoom );
			AttributedString as = new AttributedString(String.valueOf(-i/100.0));
			as.addAttribute( TextAttribute.FONT, f );
			g2.drawString(as.getIterator(), i, 0);
			}
		}
		n=1;
		for (int i=0;i<=g2.getClip().getBounds().height/2;i=i+k*10){
			g2.drawLine(-g2.getClip().getBounds().width/2,i ,g2.getClip().getBounds().width/2, i );
			n++;
			if (n%3==0){
			Font f = new Font(null, Font.PLAIN,900/Feld.drawArea.Zoom );
			AttributedString as = new AttributedString(String.valueOf(-i/100.0));
			as.addAttribute( TextAttribute.FONT, f );
			g2.drawString(as.getIterator(),0, i);
			}
		}
		n=1;
		for (int i=0;i>=-g2.getClip().getBounds().height/2;i=i-k*10){
			g2.drawLine(-g2.getClip().getBounds().width/2,i ,g2.getClip().getBounds().width/2, i );
			n++;
			if (n%3==0){
			Font f = new Font(null, Font.PLAIN,900/Feld.drawArea.Zoom );
			AttributedString as = new AttributedString(String.valueOf(-i/100.0));
			as.addAttribute( TextAttribute.FONT, f );
			g2.drawString(as.getIterator(),0, i);
			}
		}
		
		g2.setColor(Color.black);	//Farbe wieder schwarz
		
		Feld.feld.draw(g2);
		Feld.dlgEig.refresh();
	  }
	}
```


```
public void run(){
	Feld.drawArea.repaint();
	try {
		if(move)Feld.sleep(100);
		else Feld.sleep(500);
		run();
	} catch (InterruptedException e) {
		// TODO Automatisch erstellter Catch-Block
		e.printStackTrace();
	}
}
```

so ich hoffe ihr könnt mir helfen
schonmal danke im vorraus  :wink:


----------



## Marco13 (26. Mrz 2008)

```
public void run(){
   Feld.drawArea.repaint();
   try {
      if(move)Feld.sleep(100);
      else Feld.sleep(500);
      run();
```
Kann es sein, dass das GU einfriert, weil die eine StackOverflowException bekommst? Du machst da einen unbedingten, rekursiven aufruf an "run" - spätestens nach ein paar Minuten kracht's da....


----------



## reto (27. Mrz 2008)

öhm nee des komische is das überhaupt keine fehlermeldung kommt.....
hm und wie sollte ich das problem das du meinst falls es mal auftritt lösen?


----------



## doctus (27. Mrz 2008)

beispielsweise mit einer schleife?


```
public void run(){
while(!programmBeendet){
Feld.drawArea.repaint(); 
   try { 
      if(move)Feld.sleep(100); 
      else Feld.sleep(500); 
   } catch (InterruptedException e) { 
      // TODO Automatisch erstellter Catch-Block 
      e.printStackTrace(); 
   }
}
}
```


----------



## Guest (27. Mrz 2008)

ja ok das hab ich jetzt geändert aber das war nicht das problem. meine gui friert immer noch ein


----------



## Marco13 (27. Mrz 2008)

Kannst du ein kleines(!) compilierbares(!) Beispiel posten, wo das Problem auftritt?


----------



## reto (28. Mrz 2008)

ok das hier ist ein kleines Beispiel bei dem das Problem auch auftritt

```
package neu;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.font.TextAttribute;
import java.text.AttributedString;

import javax.swing.JDialog;
import javax.swing.JFrame;




public class Neu extends Thread{
	
	public static int Zoom=30;
	public static DrawArea drawArea = new DrawArea(); 
	public static JFrame frame = new JFrame();
	public static Neu n = new Neu();
	public static JDialog dlgEig = new JDialog();

	public void run(){
		while(frame.isVisible()){
			drawArea.repaint();
			try {
				Neu.sleep(500);
			} catch (InterruptedException e) {
				// TODO Automatisch erstellter Catch-Block
				e.printStackTrace();
			}
		}
	}

public static void main(String[] args) {

	frame.setSize(java.awt.Toolkit.getDefaultToolkit().getScreenSize());
	frame.setLayout(null);
	frame.setResizable(false);
	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);	
	frame.setVisible(true);
	drawArea.setBounds(0, 0, frame.getWidth(), frame.getHeight());
	frame.add(drawArea);
	drawArea.setVisible(true);
	dlgEig.	setBounds(650, 500, 250, 70);
	dlgEig.setVisible(true);
	dlgEig.setAlwaysOnTop(true);
	n.start();
		
}

static void draw(Graphics2D g2){
	g2.setRenderingHint( RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
	g2.translate(g2.getClip().getBounds().width/2, g2.getClip().getBounds().height/2);
	g2.scale(Zoom/100.0,Zoom/100.0);
	g2.setColor(Color.WHITE);
	
	g2.fill(g2.getClip());  
	g2.setColor(Color.gray);
	
	int k = (g2.getClip().getBounds().width/400)*10;
	int n=1;
	for (int i=0;i<=g2.getClip().getBounds().width/2;i=i+k){
		g2.drawLine(i, -g2.getClip().getBounds().height/2, i, g2.getClip().getBounds().height/2);
		g2.drawLine(-i, -g2.getClip().getBounds().height/2, -i, g2.getClip().getBounds().height/2);
		n++;
		if (n%3==0){
		Font f = new Font(null, Font.PLAIN,900/Zoom );
		AttributedString as = new AttributedString(String.valueOf(i/100.0));
		as.addAttribute( TextAttribute.FONT, f );
		g2.drawString(as.getIterator(), i, 0);
		g2.drawString(as.getIterator(), -i, 0);
		}
	}
	n=1;
	for (int i=0;i<=g2.getClip().getBounds().height/2;i=i+k){
		g2.drawLine(-g2.getClip().getBounds().width/2,i ,g2.getClip().getBounds().width/2, i );
		g2.drawLine(-g2.getClip().getBounds().width/2,-i ,g2.getClip().getBounds().width/2, -i );
		n++;
		if (n%3==0){
		Font f = new Font(null, Font.PLAIN,900/Zoom );
		AttributedString as = new AttributedString(String.valueOf(-i/100.0));
		as.addAttribute( TextAttribute.FONT, f );
		g2.drawString(as.getIterator(),0, i);
		g2.drawString(as.getIterator(),0, -i);
		}
	}


}
}
```

wenn man jetzt den dialog schnell über den frame zieht friert die Gui (zumindest bei mir) manchmal ein...
hoffe ihr könnt mir helfen bin nämlich noch ziemlicher anfänger und hab keine ahnung


----------



## Guest (28. Mrz 2008)

oh ich hab noch was vergessen:

```
package neu;

import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JComponent;




public class DrawArea extends JComponent{

	private static final long serialVersionUID = -6380152373145151531L;
	public int Zoom;

	
	public DrawArea(){
		Zoom=24;
		
		
	}
	public void setZoom(int z){
		this.Zoom = z;
		if (Zoom==0)Zoom = 25;
		this.repaint();
	}
	
	public void paint( Graphics g ) { 
		Graphics2D g2 = (Graphics2D) g; 
		Neu.draw(g2);
	  }
	}
```


----------



## Marco13 (28. Mrz 2008)

Hm  ???:L das Problem taucht jetzt bei mir auch auf - aber eigentlich ist das ja alles ganz unverfänglich  ???:L Sorry, ich hab' im Moment absolut keinen Plan, waoran das liegen könnte - wirkllich seltsam - vielleicht hat jemand anderes eine Idee.... ???


----------



## Guest (31. Mrz 2008)

hat da wirklich keiner ne idee??? hatte das problem noch keiner?...könnte das auch alles anders lösen aber so wärs schöner


----------



## Marco13 (31. Mrz 2008)

Hm. Wie du das "anders" lösen willst, weiß ich jetzt aber nicht: Wenn du nicht weißt, was den Fehler verursacht, weißt du ja im voraus auch nicht, ob der Fehler bei der "anderen" Lösung nicht auch auftreten würde...

Das, was du mit dem Dialog machst, sieht übrigens irgendwie so aus, als sollte das ein "modaler" Dialog sein. Falls dem so ist, solltest du einen "echten" modalen Dialog verwenden (und natürlich diese ganzen static-Fields rausnehmen, aber das war vmtl. nur zum Testen....)


----------



## Guest (1. Apr 2008)

nee mit anders lösen mein ich keinen dialog sondern n panel zu nehmen
und mein dialog soll nich modal sein. der soll die ganze zeit angezeigt werden weil man da eigenschaften von den sachen die gezeichnet werden ändern kann


----------



## Quaxli (1. Apr 2008)

Ich konnte das Problem nur schwer nachvollziehen und so richtig eingefrohren ist es bei  mir auch nie. Aber ein paar "Unterbrechungen" hatte ich doch. Allerdings nicht mehr, nachdem ich den sleep angepaßt hatte:


```
public void run() {
		while (frame.isVisible()) {
			drawArea.repaint();
			try {
				Neu.sleep(20);
			} catch (InterruptedException e) {}
		}
	}
```

500 ms finde ich für eine Animation auch etwas viel. Und den ganze Hintergrund jedes mal neu zeichnen: Hatten wir da nicht schon mal eine Diskussion wo vorgeschlagen wurde, das Ganze in ein Image zu gießen?
Ansonsten interessanter Programmierstil (ohne Ironie)


----------



## Guest (3. Apr 2008)

nee also sleep is nicht das problem....
hab gedacht ich kann das problem umgehen in dem ich anstatt n dialog n panel nehm aber das programm friert bei mir sogar ein wenn ich nur n tooltip anzeigen will. ich verstehs nich  :cry:


----------



## lohr (3. Apr 2008)

der Fehler ist irgendwo in deiner ersten For Schleife...
denk ich zumindest, bin grad noch am drüberguggn ^^

In Zeile 67 und 80 "i++;"
danach funktionierts  aber tut halt nicht mehr was es sollte, aber hier solltest mal deinen lösungsansatz beginnen...
ich nehm mal an er hängt sich da irgendwo in der schleife auf...


----------



## EgonOlsen (3. Apr 2008)

Das kommt schlicht daher, dass k mit Ganzzahlen berechnet wird. Wenn es kleiner als 400 ist (was vorkommt), dann kommt für k 0 heraus, ergo Endlosschleife.

Kann man z.B. ändern in:


```
int k = (int)(((float)g2.getClip().getBounds().width/400f)*10f);
```

Wobei ich trotzdem noch den 0er-Fall anfangen würde.


----------



## reto (3. Apr 2008)

wow du hast recht wie geil. danke :!:  :toll:  :toll:


----------

