JPanel - Problem mit Thread

EvilHomy

Grünschnabel
Hallo liebe Wissenden.
Ich schlage mich schon das ganze Wochenende mit einem Problem herum, dass ich für völlig unsinnig halte.
Ich habe eine von JPanel abgeleitete Klasse und in meinem paintComponent() rufe ich in einer if-Anweisung eine Funktion auf. Über einen Thread rufe ich repaint() auf. Nun stellt es sich so dar, dass wenn ich in dieser Funktion aufwendigere abfragen mache, der Thread trotzdem ins Stocken gerät obwohl die if-Bedingung auf false steht. Kommentiere ich die Funktion aus, ist es wieder flüssig.
Woran kann das nur liegen
Achso bei Ausführung als ein Applet tritt dieses Problem nicht auf, nur wenn es als Application läuft.

die genannte Funktion:
Java:
private void compute()
	{
		p.setOrigin(origin1);
		pType = reference.p1Combo.getSelectedIndex();
		switch (pType)
		{
			case 0:
				passValue1 = pFaktor*reference.u0Slider1.getValue();
				passValue2 = pFaktor*reference.v0Slider1.getValue();
				p.setP(passValue1, passValue2);
				break;
			case 1:
				passValue1 = qFaktor*reference.powerSlider1.getValue();
				p.setQ(passValue1);
				break;
			case 2:
				passValue1 = wFaktor*reference.powerSlider1.getValue();
				p.setW(passValue1);
				break;
			case 3:
				passValue1 = 180f/reference.eDirSlider1.getValue();
				passValue2 = eMagFaktor*reference.ePowSlider1.getValue();
				p.setE(passValue1, passValue2);
				break;
			case 4:
				passValue1 = dFaktor*reference.powerSlider1.getValue();
				p.setD(passValue1);
				break;
			default : 
				p.setP(20, 0);
				
		}
q.setOrigin(origin2);
		qType = reference.p2Combo.getSelectedIndex();
		switch (qType)
		{
			case 0:
				passValue1 = pFaktor*reference.u0Slider2.getValue();
				passValue2 = pFaktor*reference.v0Slider2.getValue();
				q.setP(passValue1, passValue2);
				break;
			case 1:
				passValue1 = qFaktor*reference.powerSlider2.getValue();
				q.setQ(passValue1);
				break;
			case 2:
				passValue1 = wFaktor*reference.powerSlider2.getValue();
				q.setW(passValue1);
				break;
			case 3:
				passValue1 = 180f/reference.eDirSlider2.getValue();
				passValue2 = eMagFaktor*reference.ePowSlider2.getValue()*reference.ePowSlider2.getValue()*reference.ePowSlider2.getValue();
				q.setE(passValue1, passValue2);
				break;
			case 4:
				passValue1 = dFaktor*reference.powerSlider2.getValue();
				q.setD(passValue1);
				break;
			default : 
				q.setQ(10000f);
		}
		
		q.add(p);
		updateGfx = true;	

	}


das paintComponent()
Java:
Graphics2D g2D = (Graphics2D) g;
		g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
		
MyMath.getTime("repaint");
		
		dim = this.getSize();
		if (!dim.equals(dimOld))  //wird nur gemacht, wenn die Grösse sich geändert hat
		{
			computeFlag = true;
			init();
			dimOld = dim;
		}

		if(computeFlag)
		{
			compute();
			computeFlag = false;
		}

Das Applet verwende ich als Application mit Hilfe diese Codes:
Java:
public static void main(String[] args)
	{
		JFrame f = new JFrame("PS");
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Applet applet = new reference();
		f.add("Center", applet);
		applet.init();
		f.setSize(new Dimension(640, 480));
		//f.pack();
		f.setVisible(true);
	}

Ja eine Ausgabe findet hier nicht statt. Über die Funktion getTime lasse ich mir den Zeitversatz zum letzten Aufruf ausgeben.


MfG EH.
 
Zuletzt bearbeitet:
Es scheint als sei das Problem durch den GarbageCollector hervorgerufen worden. Eigenartiger Weise mit den beschriebenen Auswirkungen.

Im Thread wurden durch eine aufgerufene Funktion einer eingebundenen Klasse immer wider neu float[2] erstellt.

Also gelöst.
 
Zurück