I bestimmten Bereich auf JPanel zeichnen möchten, wie dieser (schwarzer Bereich ist, wo ich JPanel werden neu gestrichen wollen):java neu streichen mehrere Bereich
Below-Code ist, wie ich dies implementiert. Es folgt dem Mauszeiger und zeichnet einen Kreis am Mauszeigerpunkt. Die Größe des Rahmens und der Platte ist 300 * 300.
public class MiniGraphicTest extends JPanel{
private static final long serialVersionUID = 1L;
public int x,y;
public MiniGraphicTest() {
super();
x = -1;
y = -1;
addMouseMotionListener(new MouseMotionAdapter(){
@Override
public void mouseMoved(MouseEvent m){
x = m.getX()-25;
y = m.getY()-25;
repaint(100,100,100,100);
repaint(200,200,100,100);
}
});
}
protected void paintComponent(Graphics g){
super.paintComponent(g);
//////////////////////
//DO NOT MODIFY HERE//
//////////////////////
//Draw gridline
int width = this.getWidth();
int height = this.getHeight();
g.setColor(Color.BLACK);
for(int i=100;i<width;i+=100){
g.drawLine(i, 0, i, height);
}
for(int i=100;i<height;i+=100){
g.drawLine(0, i, width, i);
}
//////////////////////
//put test code here//
//////////////////////
if(x == -1&&y==-1) return;//initially draw nothing
g.fillOval(x, y, 50, 50);
}
}//main function is just showing the panel. nothing special
public static void main(String[] args) {
JFrame jf = new JFrame("Test");
MiniGraphicTest test = new MiniGraphicTest();
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
test.setPreferredSize(new Dimension(300, 300));
jf.setResizable(false);
jf.add(test);
jf.pack();
jf.setVisible(true);
}
Das Ergebnis dieser Code ist wie folgt:
Es frischt außerhalb des Bereichs neu gestrichen werden. Kannst du mir erklären, warum das passiert ist und wie du das lösen kannst?
PS. Der Code funktioniert vollständig, wenn nur ein einzelnes Repaint (100, 100, 100, 100) in mouseMoved aufgerufen wird.
Danke
Sehen Sie, ob dieses Thema Ihnen helfen kann: http://stackoverflow.com/questions/32815493/custom-painting-of-a-swing-component-with-multiple-calls-to-repaint – Berger
zeichnen Sie Kreis nur wenn Maus ist innerhalb der erforderlichen Quadrate. –
@Berger Vielen Dank für den Link. Ich verstehe, dass multiple repaint() -Methode "irgendwie verarbeitet" wird und nur einmal neu streichen wird, aber es erklärt nicht, warum es unerwünschten Bereich neu übermalt, es sei denn, der "Prozess" würde diesen Bereich einschließen. – minolee