计时器应该改变每个滴答的位置,直到它到位,而不是在每个滴答,你正在运行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(幻灯片)相关推荐

  1. java可视化模板——java可视化操作步骤

    public class XXXX{ public static void main(String[] args) {MyFrame frame= new MyFrame();frame.setVis ...

  2. 秒表计时器——Java基础练手项目(Java课程设计)

    前言:鄙人是大二在读学生,大二上学期Java课程设计选了一个秒表计时器的题目,在此把代码和心得分享出来(懒人可以直接看PPT).鄙人资历尚浅,代码中会有许多不当之处,望各位大佬海涵,有更好的建议希望各 ...

  3. Java EE中的RESTful计时器

    在这篇文章中.... EJB计时器旋风之旅 通过带有示例实现的简单REST接口即时使用EJB计时器 更新(2015年7月14日) 现在可以在OpenShift上使用该应用程序的前端 . 由于我是前端新 ...

  4. java小程序:控制台字符动画

    java小程序:控制台字符动画 说在前面 程序效果 代码呈现 说在前面 大一软件工程在读,java萌新一只,第一次写博客,技术很菜勿喷.如有错误欢迎指出! 这个小程序是给朋友的生日礼物,耗时半天,实际 ...

  5. java可视化模拟进程的并发执行

    java可视化模拟进程的并发执行 模拟内容 附录程序清单 效果展示 模拟内容 利用JAVA语言,模拟进程的并发执行的过程.一是体现在单CPU环境下,对CPU的竞争:二是体现在无明确调度算法支撑下,进程 ...

  6. 搭建JAVA可视化开发环境

    搭建JAVA可视化开发环境需要如下步骤: 1.下载安装Eclipse 2.下载安装EMF插件 3.下载安装GEF插件 4.下载安装VE插件 5.使用 1.下载安装Eclipse 返回 下载地址:htt ...

  7. java 可视化_可视化Java 9模块关系

    java 可视化 正如我在之前的文章中所述 ,我已经在Java 9 + Jigsaw构建上运行Eclipse Neon了一段时间,并且没有任何问题. 我在周末花了几个小时来修改一些模块化工具的想法. ...

  8. JAVA 可视化日历

    JAVA 可视化日历(完美版) 坚持每天都写一篇这样的小文章,越努力,越幸运!!! 顺便提一句 老师曰:"冰心曰:"好读书,多读书,读好书""" 废话 ...

  9. java panel 所有事件_java-侦听/处理JPanel事件

    先生们女士们晚上好, 我有一个Java Swing无法解决的问题,也许您可​​以帮助我.这里是: >我有一个使用BorderLayout的JFrame和许多JPanels. >每当我需要建 ...

最新文章

  1. Linux/Unix环境下的make和makefile详解
  2. MATLAB图像函数 块和邻域的处理
  3. 引入sentinel后,json转化异常
  4. swoole之代码热更新实现
  5. 计算机安全可靠替代工程,基于安全可靠软硬件的党政军OA系统的整系统优化方法与研究-计算机技术专业论文.docx...
  6. php转型mysql dba_MySQL_DBA整理(转)
  7. Linux中锁的总结
  8. Linux系统 UDP 丢包问题分析思路和修改网卡缓存
  9. 翻译:swift 5通过使用泛型进行高级异步操作Operation
  10. python读取odb_abaqus通过python从ODB中抽取模型数据和结果数据.pdf
  11. 静态代理和动态代理区别(是否有实现类)
  12. 首页技术支持常见问题宽带外网IP显示为10、100、172开头,没有公网IP,如何解决?...
  13. 澳洲电源和电池充电器对应标准的公告将强制执行2022年6月15日起
  14. mysql 利用游标循环删除数据报错:No data - zero rows fetched, selected, or processed
  15. 计算机技术服务业成本核算,技术服务成本怎么核算?
  16. flexbison编写语法分析器
  17. logical exclusive 与 physical exclusive 的区别
  18. 工信部通报下架60款APP:关联有赞、三六零、唯品会等上市公司
  19. Anaconda Distribution :流行的Python数据科学平台
  20. 里约奥运会开幕:您的好友机器人记者已上线!

热门文章

  1. 计算机组成原理实验四 微程序控制器实验报告
  2. M3800的故事——Ipad mini2·电源1
  3. git入库基本操作流程
  4. 获取两个日期间的年份差 月份差 日期差
  5. 啊哈添柴挑战Java1016. 反向输出一个三位数
  6. 吃货贴 | 「咸、甜、辣」如何影响肠道菌群?
  7. 如何关闭电脑的休眠功能
  8. Vivado仿真小技巧,让所有模块的波形都可以显示
  9. 如何提高接收机的灵敏度
  10. 如何解决iOS设备AppStore下载一直是正在载入中