java - 模拟水滴的程序
问题描述
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();
}
}
解决方案
Java 的 GUI 是单线程的。只要jPanel1MouseClicked
方法执行,一切都会暂停,因此您无法在方法内部设置动画。它与处理大型事物时熟悉的应用程序挂起/冻结相同。
您需要Timer
从可以推进动画“状态”并重绘的构造函数开始。
然后,您需要创建一个或多个数据结构来存储您过去的所有鼠标坐标以及半径(无线电?)。
计时器应该增加圆圈的半径并重新绘制所有内容。如果面板不透明,您可以利用它来发挥自己的优势。
(您可能想要删除太旧或半径太大的坐标,否则内存会无限增长)
推荐阅读
- azure-signalr - Azure SignalR 超时问题
- oracle-cloud-infrastructure - 是否有可能检查用户是否在 OCI 中获得了策略?
- r - 如何在R中填写NA以获得准相同的行?
- powershell - 将 ADObject 数据导出为 CSV
- go - 是否可以将可变参数 args 与标志包使用结合起来?
- reactjs - Typesafe反应装饰器无法识别传递函数的ReturnType
- python-3.x - 在 Conda 环境中成功安装包后的 ImportError
- ruby-on-rails - SyntaxError:获取rails json时JSON中位置1的意外标记o
- signals - 洗牌后重新排列信号频谱
- c# - 在保留边框的同时删除标题栏