gui friert ein

Status
Nicht offen für weitere Antworten.
R

reto

Gast
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
Code:
	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();
	  }
	}
Code:
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

Top Contributor
Code:
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....
 
R

reto

Gast
ö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

Bekanntes Mitglied
beispielsweise mit einer schleife?

Code:
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(); 
   }
}
}
 
G

Guest

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

reto

Gast
ok das hier ist ein kleines Beispiel bei dem das Problem auch auftritt
Code:
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 :oops:
 
G

Guest

Gast
oh ich hab noch was vergessen:
Code:
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

Top Contributor
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.... ???
 
G

Guest

Gast
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

Top Contributor
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....)
 
G

Guest

Gast
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

Top Contributor
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:

Code:
	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) :)
 
G

Guest

Gast
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:
 
L

lohr

Gast
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

Bekanntes Mitglied
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:

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

Wobei ich trotzdem noch den 0er-Fall anfangen würde.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben