Problem mit Transparenz, MouseEvents und Performance

  • Themenstarter Themenstarter FMeise
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
F

FMeise

Gast
Hallo,

ich habe folgendes kleines Test Programm geschrieben:

Code:
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.awt.image.*;
import javax.swing.*;

public class Main extends JPanel
{
	private Rectangle2D[] r = {new Rectangle2D.Double(10, 50, 100, 100),
														 new Rectangle2D.Double(50, 100, 100, 100),
														 new Rectangle2D.Double(100, 150, 100, 100)};
	private int clickCounter = 0;
	private int repaintCounter = 0;
	
	public Main()
	{
		addMouseListener(new MouseAdapter()
		{
			public void mouseClicked(MouseEvent e)
			{
				clickCounter++;
				repaint();
			}
		});
	}
	
  protected void paintComponent( Graphics g )
  {
		super.paintComponent(g);
		
		Graphics2D g2d = (Graphics2D)g;
		
		repaintCounter++;
		
		g2d.drawString("Mouse clicks: " + clickCounter + " - Repainted: " + repaintCounter, 10, 12);
		
		g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f));
		
		g2d.setColor(Color.BLUE);
		g2d.fill(r[0]);

		g2d.setColor(Color.RED);
		g2d.fill(r[1]);

		g2d.setColor(Color.GREEN);
		g2d.fill(r[2]);
  }

  public static void main( String args[] )
  {
    JFrame f = new JFrame( "Main" );
    f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    f.getContentPane().add( new Main() );
    f.setSize( 250, 300 );
    f.setVisible( true );
  }
}

Das Programm zeichnet drei Shapes, die durscheinend sein sollen. Bei jedem Mausklick auf das Fenster wird neu gezeichnet. Wenn ich jetzt mehrmals schell hintereinander klicke, gehen MouseEvents verloren (sieht man an den Contern).

Das ganze scheint wohl am AlphaComposite.getInstance zu liegen, das anscheinend sehr viel Zeit benötigt. Ist das normal, oder mache ich etwas falsch.

Danke schon mal im voraus für eure Antworten.

Chris

PS: Eigentlich möchte ich erreichen, dass ich Shapes auf eine Zeichenfläche malen kann und diese dann langsam verblassen, sprich immer transparenter werden, bis ich sie dann schließlich lösche. Wenn ich aber jedes mal das Composite neu setzte, wird meine paint-Methode viel zu lansam.
 
Berichtigung: Natürlich gehen keine MouseEvents verloren, aber es wird nicht jedemal das repaint() ausgeführt, wenn ein MouseEvent eintritt.
 
"repaint" stellt nur eine höfliche Anfrage, dass das Fenster doch bitte neu gezeichnet werden soll. Ob die Anfrage beachtet wird, hängt davon ab, wie beschäftigt das Programm ist (das hast du ja auch selbst bemerkt).
Das ist durchaus gewollt: ansonsten könnte man ein Progi mit 10000 überflüssigen repaints blockieren...
Dein "repaintCounter" sollte halt nur "paintCounter" heissen, aber in irgendwelchen "paint"-Methoden sollte man sowieso nie irgendeine Art von Logik stecken (die nix mit dem Zeichnen zu tun hat) :wink:.
 
und wenn das instantiieren des AlphaComposites so lange dauert, dann instantiiere es doch auch nur einmal, steck es in eine variable anstatt es bei jedem paint() neu zu erzeugen 🙂
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben