Java repaint() zeichnet Canvas Objekt nicht neu

Mitzekotze

Mitzekotze

little man
Kann mir jemand sagen, warum der Aufruf von "malFlaeche.repaint()" in den Methoden "mouseMoved" und "mouseDragged", in der Klasse "Events" dazu führt, dass die komplette Fläche des Canvas Objektes "malFlaeche" weiß eingefärbt wird? Es scheint so, als ob für das Neuzeichnen nicht meine überschriebene "update()" bzw. "paint()" Methode verwendet wird, sondern die entsprechenden Methoden aus der Eltern Klasse "Canvas".

Hat einer von euch eine Idee wo der Fehler liegt?

Code:
import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

@SuppressWarnings("serial")
public class JavaPaint extends Canvas
{
    public static void main(String[] args)
    {
        @SuppressWarnings("unused")
        JavaPaint ob = new JavaPaint();
    }
    
    private Frame frame;
    private Canvas malFlaeche;
    
    private Graphics2D graKontext;
    private Image bufferImage;
    private Color farbe;
    private BasicStroke stiftStaerke;
    
    private int X;
    private int Y;
    private int altX;
    private int altY;
    
    public JavaPaint()
    {
        X = 0;
        Y = 0;
        altX = 0;
        altY = 0;
        
        farbe = Color.black;
        stiftStaerke = new BasicStroke(10, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND);       
        
        malFlaeche = new Canvas();
        malFlaeche.setBackground(Color.WHITE);
        malFlaeche.addMouseMotionListener(new Events());
        
        frame = new Frame("JavaPaint");
        frame.add(malFlaeche,BorderLayout.CENTER);
        frame.addWindowListener(new Events());
        frame.setSize(500,500);
        frame.setVisible(true);
    }
    
    @Override
    public void update(Graphics g)
    {
        // Initialisierung des DoubleBuffers
        if (bufferImage == null)
        {
            bufferImage = malFlaeche.createImage (malFlaeche.getSize().width, malFlaeche.getSize().height);
            graKontext = (Graphics2D) bufferImage.getGraphics();
        }
        
        paint(graKontext);
        g.drawImage(bufferImage,0,0,null);
    }
    
    @Override
    public void paint(Graphics g)
    {
        g.setColor(farbe);
        ((Graphics2D) g).setStroke(stiftStaerke);
        g.drawLine(X-2, Y-2 , altX-2, altY-2);
    }
    
    public class Events extends WindowAdapter implements MouseMotionListener
    {
        @Override
        public void mouseDragged(MouseEvent e)
        {
            X = e.getX();
            Y = e.getY();
            
//            update(malFlaeche.getGraphics());
            malFlaeche.repaint();
            
            altX = e.getX();
            altY = e.getY();
        }

        @Override
        public void mouseMoved(MouseEvent e)
        {
            altX = e.getX();
            altY = e.getY();
//            malFlaeche.getGraphics().drawImage(bufferImage,0,0,null);
            malFlaeche.repaint();
        }
        
        @Override
        public void windowClosing(WindowEvent e)
        {
            System.exit(0);
        }
    }
}
 
He he hab den Fehler gefunden. Man sollte auch das Objekt für den Canvas aus der Klasse erschaffen, in der man von Canvas erbt und die "paint()" bzw. "update()" Methode überschrieben hat. Hab das ganze jetzt durch das Erstellen einer eigenen Klasse gelöst, welche von Canvas erbt und die beiden Methoden überschreibt.
 

Ähnliche Themen

"non blocking console input" wieder rückgängig machen?

Performant Scrollen

Problem mit HSPA+ Modem Huawei E353 - Installation unmöglich?

Displayport + externer Monitor zeigt bei startx nichts erst bei DVI

NagiosGrapher 1.7.1 funktioniert nicht

Zurück
Oben