1。这是我在程序中所做的。我唯一的问题是,它不会擦除我之后创建的圆,因为我希望它具有像水波一样的流体运动。
private void jPanel1MouseClicked(java.awt.event.MouseEvent evt) {
int radio = 0;
try {
radio = Integer.parseInt(radio1.getText());
} catch (NumberFormatException e) {
System.out.println("ERROR. Introduzca un numero");
}
int x = evt.getX();
int y = evt.getY();
int x1 = x - radio / 2;
int y1 = y - radio / 2;
for (int i = 0; i <= 10; i++) {
jPanel1.getGraphics().drawOval(x1, y1, radio, radio);
radio += 10;
x1 = x - radio / 2;
y1 = y - radio / 2;
try {
Thread.sleep(20);
} catch (InterruptedException ex) {
Logger.getLogger(NewJFrame.class.getName()).log(Level.SEVERE, null, ex);
}
jPanel1.repaint();
}
}
答案 0 :(得分:0)
Java的GUI是单线程的。只要jPanel1MouseClicked
方法执行,一切都会暂停,因此您无法在该方法内设置动画。与处理大型内容时熟悉的应用程序挂起/冻结相同。
您需要从构造函数中启动Timer
,该构造函数可以推进动画的“状态”并重绘。
然后,您需要建立一个或多个数据结构来存储所有过去的鼠标坐标以及半径(半径?)。
计时器应增加圆圈的半径并重新粉刷所有。如果面板不透明,则可以利用它来发挥自己的优势。
(您可能希望删除太旧或半径太大的坐标,否则内存将无限制地增长)