Piszę sobie taki program:
import java.awt.*;
import java.awt.event.*;
public class Kropa extends Frame{
int liczX=0, liczY=0;
int[] iksy = new int[20];
int[] igreki = new int[20];
int mouseX, mouseY, pointX, pointY;
Kropa(String name){
super(name);
setBounds(200, 100, 800, 600);
setMinimumSize(new Dimension(500, 400));
Zdarzenia obsZd = new Zdarzenia();
addMouseMotionListener(obsZd);
addMouseListener(obsZd);
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent we){
System.exit(0);
}
});
}
private boolean isInBelt(int x, int y){
return mouseX<x+6 && mouseX>x-6 && mouseY>y-6 && mouseY<y+6;
}
public void paint(Graphics g){
g.setColor(Color.RED);
for(int i=0; i<liczX; i++){
if(isInBelt(iksy[i], igreki[i])){
g.fillOval(iksy[i]-4, igreki[i]-4, 9, 9);
g.drawString(iksy[i]+" "+igreki[i], iksy[i]+10, igreki[i]-10);
}else g.fillOval(iksy[i]-2, igreki[i]-2, 5, 5);
}
if(pointX!=-1&&pointY!=-1){
g.fillOval(pointX-4, pointY-4, 9, 9);
g.drawString(pointX+" "+pointY, pointX+10, pointY-10);
}
g.drawPolyline(iksy, igreki, liczX);
}
public static void main(String[] args){
Kropa okno = new Kropa("moje okno");
okno.setVisible(true);
}
class Zdarzenia extends MouseAdapter implements MouseMotionListener{
public void mouseDragged(MouseEvent arg0){
mouseX=pointX=arg0.getX();
mouseY=pointY=arg0.getY();
repaint();
}
public void mouseMoved(MouseEvent me){
mouseX=me.getX();
mouseY=me.getY();
repaint();
}
public void mouseReleased(MouseEvent arg0){
iksy[liczX++]=mouseX;
igreki[liczY++]=mouseY;
pointY=pointX=-1;
repaint();
}
}
}
Rysuje on łamaną linię wg. kliknięć użytkownika. Punkty załamania stanowią kropki, które stają się większe i wyświetlają swoje współrzędne po najechaniu na nie kursorem. Program działa jak należy, ale jego mankamentem jest migotanie figur przy ruchu kursora. Domyślam się w czym rzecz: metoda paint() jest wywoływana w trybie ciągłym przez metody mouseMoved() i mouseDragged(). O ile z mouseMoved mogę sobie poradzić(umieszczając w niej warunek odświeżenia tylko jeżeli kursor znajduje się w pobliżu którejś kropki) to pozostaje jeszcze kwestia mouseDragged która musi pracować w trybie ciągłym, bo właśnie rysowana kropka jest na bieżąco prezentowana na ekranie, a to wymaga nieustannej aktualizacji. Co zmienić, żeby rysowało obraz bez zająknięcia?