Zeichnen auf eine SWING Komponente

wako

Grünschnabel
Hallo an alle,

ich habe folgendes Problem:

Hab mir nen kleinen MP3Player geschrieben, mit Lauftext, Lieder abspielen und AlbumInfos. Das ganze ist auf einem Window drauf. Jetzt hab ich noch ein Label drauf gemacht, das ne größe ca. 200x200 hat. Auf dieses Label will ich nun zeichnen, egal was, aber es soll sich immer verändern. z.b. einen Kreis dessen radius sich immer verändert.
Wie kann ich nun die Oberfläche aktualisieren, das alles neu angezeigt wird, wenn sich der Kreis verändert? hab für das Zeichnen des Kreises nen Thread laufen, allerdings flackert alles wie sau? woran kann das liegen? wird zu langsam gezeichnet?

diese Methode ruft mein Thread immer auf:

public void paintLabel()
{
Graphics g = this.lEqulizer.getGraphics();
try
{
g.setColor( new Color(0,0,0,255));//-(iAlphaWert*20)) );
iWert++;
g.drawOval(50,50,iWert,iWert)
if( iWert > 100 ) iWert = 10;
)
super.paint( this.getGraphics() );
}


ich hoffe mir kann einer helfen....das mit auf Komponenten zeichnen is glaub auch ne kunst für sich.

danke, cu wako
 
Hallo!

Um das neuzeichnen zu beschleunigen, kannst du die Methode update(Graphics g) für deine Zeichenfläche überschreiben.

z.B.

Code:
public void update(Graphics _g){
 paint(_g);
}

Grüsse TrueSun
 
Hallo!

Schau mal hier:

Code:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferStrategy;

import javax.swing.JFrame;

/**
 * @author      Darimont<br>
 * @version     1.0<br>
 * Date of creation:  30.06.2004<br>
 * File:         BufferedAnimator.java<br>
 * Modifier:     Darimont<br>
 * Revision:     Revision<br>
 * State:        Germany<br>
 */

public class BufferedAnimator extends JFrame {

	private final BufferStrategy strategy;
	private final int width;
	private final int height;

	private final Thread runnerThread = new Thread() {
		{
			setPriority(Thread.MIN_PRIORITY);
		}

		public void run() {
			try {
				int radius = 5;
				int radiusCalc = 0;
				while (true) {

					Graphics2D g2d = (Graphics2D) strategy.getDrawGraphics();
					g2d.clearRect(0, 0, width, height);
					g2d.setColor(Color.RED);
					radiusCalc = radius % 100;
					//Keis zeichnen, Mittelpunkt zentrieren
					g2d.fillOval(
						width / 2 - radiusCalc / 2,
						height / 2 - radiusCalc / 2,
						radiusCalc,
						radiusCalc);

					radius++;
					g2d.dispose();
					//Auf den Bildschirm schicken.
					strategy.show();
					//Pause machen...
					sleep(50L);

				}
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	};

	public BufferedAnimator() {
		super("BufferedAnimator");
		//Beenden bei klick auf 'X'
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		width = 320;
		height = 240;
		setIgnoreRepaint(true);
		setResizable(false);
		setSize(width, height);
		setVisible(true);
		//DoubleBuffer anlegen
		createBufferStrategy(2);
		strategy = getBufferStrategy();

	}

	public static void main(final String[] args) {
		new BufferedAnimator().start();
	}

	/**
	 * 
	 */
	private void start() {
		runnerThread.start();
	}
}

Ps.:

Hallo!

Um das neuzeichnen zu beschleunigen, kannst du die Methode update(Graphics g) für deine Zeichenfläche überschreiben.

Würde zu noch mehr flackern führen.

Gruß Tom
 
Danke für die Tips,.

@thomas, wollte mal dein CodeBsp. in mein kleines Prog einbauen, hat irgendiwe nich gefunzt...aber du hast mir ispiriert und ich hab mir meinen kleinen nichts aussagenden aber schön bunten Equlizer geschreiben.

package gui;

import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;

import javax.swing.JPanel;

public class MyAninamatedPanel extends JPanel implements Runnable
{
private boolean bRunning = true;
private boolean bWait = false;

private int iWert = 0;
private int iBreite = 0;
private int iHoehe = 0;
private int iBreiteProBalken = 0;

private final Color cOrange = new Color(255,128,0,255);
private final Color cGruen = new Color(0,128,64,255);
private final Color cGelb = new Color(255,255,0,255);

private Random randomHoehe = new Random();

public MyAninamatedPanel( )
{

}

public void run()
{
this.iBreite = this.getWidth();
this.iHoehe = this.getHeight();
this.iBreiteProBalken = this.iBreite/6;

while(this.bRunning)
{
try
{
if( this.bWait )
{
this.wait();
this.bWait = false;
}

this.repaint();
Thread.sleep(150);


} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

public void anhalten()
{
this.bWait = true;
}

public void fortsetzten()
{
this.notify();
}

public void beenden()
{
this.bRunning = false;
}

public void paint(Graphics graphics)
{
// lösche alle vorherigen
graphics.clearRect(0,0,this.iBreite,this.iHoehe);

graphics.setColor( this.cGelb );
this.iWert = this.randomHoehe.nextInt( this.iHoehe );
graphics.fill3DRect( 0*this.iBreiteProBalken, this.getY()+this.iHoehe-this.iWert, this.iBreiteProBalken, this.iWert, true );

graphics.setColor( this.cOrange );
this.iWert = this.randomHoehe.nextInt( this.iHoehe );
graphics.fill3DRect( 1*this.iBreiteProBalken, this.getY()+this.iHoehe-this.iWert, this.iBreiteProBalken, this.iWert, true );

graphics.setColor(Color.RED );
this.iWert = this.randomHoehe.nextInt( this.iHoehe );
graphics.fill3DRect( 2*this.iBreiteProBalken, this.getY()+this.iHoehe-this.iWert, this.iBreiteProBalken, this.iWert, true );

graphics.setColor( this.cGruen );
this.iWert = this.randomHoehe.nextInt( this.iHoehe );
graphics.fill3DRect( 3*this.iBreiteProBalken, this.getY()+this.iHoehe-this.iWert, this.iBreiteProBalken, this.iWert, true );

graphics.setColor( Color.BLUE );
this.iWert = this.randomHoehe.nextInt( this.iHoehe );
graphics.fill3DRect( 4*this.iBreiteProBalken, this.getY()+this.iHoehe-this.iWert, this.iBreiteProBalken, this.iWert, true );

graphics.setColor( Color.CYAN );
this.iWert = this.randomHoehe.nextInt( this.iHoehe );
graphics.fill3DRect( 5*this.iBreiteProBalken, this.getY()+this.iHoehe-this.iWert, this.iBreiteProBalken, this.iWert, true );
}

}
;

klappt super....allerdings find ich das es flackert....mmh? naja egal, das reicht erstmal. BigThx
 
Zurück