java可视化计时器,java – 使用计时器动画JPanel(幻灯片)
计时器应该改变每个滴答的位置,直到它到位,而不是在每个滴答,你正在运行for-next循环,这阻止了EDT直到循环结束,防止更新UI
以示例更新
例如…
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Action;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class TestAnimatedPane {
public static void main(String[] args) {
new TestAnimatedPane();
}
public TestAnimatedPane() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
private JPanel panel;
public TestPane() {
setLayout(null);
panel = new JPanel();
panel.setBackground(Color.RED);
add(panel);
Dimension size = getPreferredSize();
Rectangle from = new Rectangle(size.width, (size.height - 50) / 2, 50, 50);
Rectangle to = new Rectangle((size.width - 50) / 2, (size.height - 50) / 2, 50, 50);
Animate animate = new Animate(panel, from, to);
animate.start();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
}
public static class Animate {
public static final int RUN_TIME = 2000;
private JPanel panel;
private Rectangle from;
private Rectangle to;
private long startTime;
public Animate(JPanel panel, Rectangle from, Rectangle to) {
this.panel = panel;
this.from = from;
this.to = to;
}
public void start() {
Timer timer = new Timer(40, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
long duration = System.currentTimeMillis() - startTime;
double progress = (double)duration / (double)RUN_TIME;
if (progress > 1f) {
progress = 1f;
((Timer)e.getSource()).stop();
}
Rectangle target = calculateProgress(from, to, progress);
panel.setBounds(target);
}
});
timer.setRepeats(true);
timer.setCoalesce(true);
timer.setInitialDelay(0);
startTime = System.currentTimeMillis();
timer.start();
}
}
public static Rectangle calculateProgress(Rectangle startBounds, Rectangle targetBounds, double progress) {
Rectangle bounds = new Rectangle();
if (startBounds != null && targetBounds != null) {
bounds.setLocation(calculateProgress(startBounds.getLocation(), targetBounds.getLocation(), progress));
bounds.setSize(calculateProgress(startBounds.getSize(), targetBounds.getSize(), progress));
}
return bounds;
}
public static Point calculateProgress(Point startPoint, Point targetPoint, double progress) {
Point point = new Point();
if (startPoint != null && targetPoint != null) {
point.x = calculateProgress(startPoint.x, targetPoint.x, progress);
point.y = calculateProgress(startPoint.y, targetPoint.y, progress);
}
return point;
}
public static int calculateProgress(int startValue, int endValue, double fraction) {
int value = 0;
int distance = endValue - startValue;
value = (int)Math.round((double)distance * fraction);
value += startValue;
return value;
}
public static Dimension calculateProgress(Dimension startSize, Dimension targetSize, double progress) {
Dimension size = new Dimension();
if (startSize != null && targetSize != null) {
size.width = calculateProgress(startSize.width, targetSize.width, progress);
size.height = calculateProgress(startSize.height, targetSize.height, progress);
}
return size;
}
}
更新
我应该在昨晚添加这个(1年不想上床,2个父母,不再说…)
动画是一个复杂的主题,尤其是当您开始查看变速时(示例是静态的).
你应该认真考虑看看…而不是重新发明轮子.
> Timing Framework – 这是基础动画框架,不会对您如何使用它做出任何假设.
> Trident – 与Timing Framework类似,但也支持基于Swing的组件(通过反射)构建
> Universal Tween Engine
java可视化计时器,java – 使用计时器动画JPanel(幻灯片)相关推荐
- java可视化模板——java可视化操作步骤
public class XXXX{ public static void main(String[] args) {MyFrame frame= new MyFrame();frame.setVis ...
- 秒表计时器——Java基础练手项目(Java课程设计)
前言:鄙人是大二在读学生,大二上学期Java课程设计选了一个秒表计时器的题目,在此把代码和心得分享出来(懒人可以直接看PPT).鄙人资历尚浅,代码中会有许多不当之处,望各位大佬海涵,有更好的建议希望各 ...
- Java EE中的RESTful计时器
在这篇文章中.... EJB计时器旋风之旅 通过带有示例实现的简单REST接口即时使用EJB计时器 更新(2015年7月14日) 现在可以在OpenShift上使用该应用程序的前端 . 由于我是前端新 ...
- java小程序:控制台字符动画
java小程序:控制台字符动画 说在前面 程序效果 代码呈现 说在前面 大一软件工程在读,java萌新一只,第一次写博客,技术很菜勿喷.如有错误欢迎指出! 这个小程序是给朋友的生日礼物,耗时半天,实际 ...
- java可视化模拟进程的并发执行
java可视化模拟进程的并发执行 模拟内容 附录程序清单 效果展示 模拟内容 利用JAVA语言,模拟进程的并发执行的过程.一是体现在单CPU环境下,对CPU的竞争:二是体现在无明确调度算法支撑下,进程 ...
- 搭建JAVA可视化开发环境
搭建JAVA可视化开发环境需要如下步骤: 1.下载安装Eclipse 2.下载安装EMF插件 3.下载安装GEF插件 4.下载安装VE插件 5.使用 1.下载安装Eclipse 返回 下载地址:htt ...
- java 可视化_可视化Java 9模块关系
java 可视化 正如我在之前的文章中所述 ,我已经在Java 9 + Jigsaw构建上运行Eclipse Neon了一段时间,并且没有任何问题. 我在周末花了几个小时来修改一些模块化工具的想法. ...
- JAVA 可视化日历
JAVA 可视化日历(完美版) 坚持每天都写一篇这样的小文章,越努力,越幸运!!! 顺便提一句 老师曰:"冰心曰:"好读书,多读书,读好书""" 废话 ...
- java panel 所有事件_java-侦听/处理JPanel事件
先生们女士们晚上好, 我有一个Java Swing无法解决的问题,也许您可以帮助我.这里是: >我有一个使用BorderLayout的JFrame和许多JPanels. >每当我需要建 ...
最新文章
- Linux/Unix环境下的make和makefile详解
- MATLAB图像函数 块和邻域的处理
- 引入sentinel后,json转化异常
- swoole之代码热更新实现
- 计算机安全可靠替代工程,基于安全可靠软硬件的党政军OA系统的整系统优化方法与研究-计算机技术专业论文.docx...
- php转型mysql dba_MySQL_DBA整理(转)
- Linux中锁的总结
- Linux系统 UDP 丢包问题分析思路和修改网卡缓存
- 翻译:swift 5通过使用泛型进行高级异步操作Operation
- python读取odb_abaqus通过python从ODB中抽取模型数据和结果数据.pdf
- 静态代理和动态代理区别(是否有实现类)
- 首页技术支持常见问题宽带外网IP显示为10、100、172开头,没有公网IP,如何解决?...
- 澳洲电源和电池充电器对应标准的公告将强制执行2022年6月15日起
- mysql 利用游标循环删除数据报错:No data - zero rows fetched, selected, or processed
- 计算机技术服务业成本核算,技术服务成本怎么核算?
- flexbison编写语法分析器
- logical exclusive 与 physical exclusive 的区别
- 工信部通报下架60款APP:关联有赞、三六零、唯品会等上市公司
- Anaconda Distribution :流行的Python数据科学平台
- 里约奥运会开幕:您的好友机器人记者已上线!