带计时器的 JPanel 动画(滑入)

2023-11-22

我正在尝试使用我制作的此类从侧面滑入 JPanel:

public class AnimationClass {

    private int i;
    private int y;
    private JPanel panel;
    private int xTo;
    private Timer timer;
    private int xFrom;

    synchronized void slidePanelInFromRight(JPanel panelInput, int xFromInput, int xToInput, int yInput, int width, int height) {
        this.panel = panelInput;
        this.xFrom = xFromInput;
        this.xTo = xToInput;
        this.y = yInput;

            panel.setSize(width, height);

            timer = new Timer(0, new ActionListener() {
                public void actionPerformed(ActionEvent ae) {

                    for (int i = xFrom; i > xTo; i--) {
                        panel.setLocation(i, y);
                        panel.repaint();
                        i--;

                        timer.stop();
                        timer.setDelay(100);

                        if (i >= xTo) {
                            timer.stop();
                        }
                    }
                    timer.stop();

                }
            });
            timer.start();

    }

}

嗯,我不知道问题是什么。我尝试了很多不同的事情,但我似乎无法让它发挥作用。


计时器应该在每个刻度上更改位置,直到它就位,相反,在每个刻度上,您都在运行 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;

    }
}

Update

我应该在昨晚添加这个(1年不想睡觉,2个父母不想睡觉,不用再说了......)

动画是一个复杂的主题,尤其是当您开始考虑变速时(示例是静态的)。

你应该认真考虑一下......,而不是重新发明轮子。

  • 时序框架- 这是基本动画框架,不会假设您可能喜欢如何使用它。
  • Trident- 与计时框架类似,但也支持内置的基于 Swing 的组件(通过反射)
  • 通用补间引擎
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带计时器的 JPanel 动画(滑入) 的相关文章

  • Twitter4j - 超出速率限制

    我想让追随者使用getFollowersIds 在 Twitter4j 中 但我得到 连接错误异常 超过限速 public static void main String args try Twitter twitter TwitterFa
  • PSQLException 没有被捕获

    我正在使用 Tomcat 6 和 Postgresql 8 4 我的代码如下所示 try Prepared statement inserting something catch final PSQLException e LOG log
  • 测试前设置TestNG的输出目录

    我正在使用 Eclipse 运行一些 TestNG 测试 使用 XML 文件 右键单击 作为 TestNG 套件运行 我仅将 Maven 用于依赖项 而不用于运行测试 有没有办法在代码中设置输出目录 例如 System out printl
  • 以行和列模式打印字符串 Java

    我刚刚创建了一个java项目来打印在行和列中给出的字符串 就像矩阵一样 这是我刚刚制作的输出 h e l l o w o r l d i t s b e a u t i f u l 是否可以将输出显示为像这样的螺旋图案 h e l l o
  • 如何在 Java 中解析这样的 URI

    我正在尝试解析以下 URI http translate google com zh CN en 你 http translate google com zh CN 7Cen 7C E4 BD A0 但收到此错误消息 java net UR
  • Java / Scala Future 由回调驱动

    简洁版本 我怎样才能创建一个Promise
  • ScrollPane滚动到底部问题

    我的 Java 应用程序中有 TextArea 并且我附加了很多文本行 我需要 ScrollPane 滚动到最后附加的 到 TextArea 的底部 我怎样才能做到这一点 您可以通过将插入符号位置移动到底部来做到这一点 这会自动滚动 Tex
  • Retrofit 2.0b2:如何从响应中获取InputStream?

    我正在使用 Retrofit 2 0b2 收到响应后 我尝试通过以下方式从响应中获取 InputStream Response
  • 如何解决找不到 com.google.cloud.Service 的类文件

    我正在尝试将 JSON 数据上传到 gcs 由于我之前没有使用谷歌云 所以我开始将随机字符串上传到 gcs 但在创建存储服务对象时我陷入了困境 Maven 依赖
  • 空手道弹簧整合

    我们有一个 Spring MVC 应用程序 是否可以在 Karate 中集成 spring 上下文 假设通过 Karate runner 绑定 SpringJunitRunner 或者通过 spring 上下文查找 bean 在空手道中一切
  • 使用超类创建构建器时,父类无法返回子类的实例[重复]

    这个问题在这里已经有答案了 如果我使用构建器模式来配置新对象 我可能有两个类 例如Game and HockeyGame 如下所示 当我想创建一个新的HockeyGame 我得到它的构建器并开始调用方法来根据需要配置对象 我遇到的问题显示在
  • 亚马逊 AWS Java API。我看不到我的 AMI

    我正在使用 Amazon AWS 的 Java API 我成功进行了身份验证 然后获取了所有图像 但我的图像不在其中 我的 AMI 是私有的 但我想自从我经过身份验证后我仍然会看到它们 这是我的来源 final AmazonEC2 clie
  • 在Java中执行.lnk文件

    我需要在java中执行 lnk文件 指向exe文件的lnk文件 我能怎么做 在 VB net 中我做 Process Start path 它有效 谢谢你的帮助 Use a 流程构建器 http download oracle com ja
  • 如何在java中模拟SHIFT+鼠标按键

    我想将鼠标指针移动到特定位置并执行 SHIFT 鼠标右键单击 我可以将鼠标移动到某个位置 但无法模拟鼠标单击 Robot r new Robot r mouseMove x1 y1 我应该做什么来模拟预期的鼠标点击 我认为您只需要一点额外的
  • 将 s:element 和 s:complexType 命名为相同的名称

    将 s element 和 s complexType 命名为相同名称是否合法 可以看到下面的代码 element和complextype具有完全相同的名称 这是 wsdl 文件的一大块
  • 如何使用 Jackson 将列表内容序列化为平面 JSON 对象?

    给定以下 POJO public class City private String title private List
  • 扩展 Lombok 困难

    我想创建一个注释处理程序来扩展 Java 语言 然而 由于 SCL 文件的原因 我无法轻松做到这一点 我想知道 Lombok 开发人员是否故意让它变得如此困难 如果我尝试扩展 JavacAnnotationHandler 它无法在 lomb
  • 用于只读 DB 的 java ORM

    我了解 hibernate 但我想知道是否有一个更轻的 ORM 引擎只读数据库 我的意思是 我不需要一些事务查询或更新一些记录 另一方面 我需要处理一些大的记录列表 List
  • 没有 WindowManager.LayoutParams.TYPE_PHONE 的粘性覆盖

    我所说的粘性是指一个不会通过调用启动器意图而关闭的窗口 intent addCategory Intent CATEGORY HOME 以前这是用完成的WindowManager LayoutParams TYPE PHONE 但此类型现已
  • java:抛出 RuntimeException [重复]

    这个问题在这里已经有答案了 下面这一项如何正确 我希望编译器告诉我使用throws Exception or throws RuntimeException public void method1 throws NullPointerExc

随机推荐

  • 如何获取句子中单词的长度?

    我正在尝试获取句子中每个单词的长度 我知道你可以使用 len 函数 我只是不知道如何获取每个单词的长度 而不是这个 gt gt gt s python is pretty fun to use gt gt gt len s 27 gt gt
  • Vue - 何时以及为何使用 $el

    我在这里找到了这个答案 https stackoverflow com a 50431015 11735826我想知道为什么这里使用 el 以及为什么没有 el 元素它就不起作用 当你使用refhtml 标签上的属性 DOM 元素由以下方式
  • Sphinx 中的常见链接目标

    我有很多 Sphinx 页面 上面有相同的链接 像那些 CC BY https creativecommons org licenses by 3 0 MIT http opensource org licenses MIT 目前 我在每个
  • 如何匹配包含特定字符串的属性?

    当属性包含多个单词时 我在按属性选择节点时遇到问题 例如 div class atag btag div 这是我的 xpath 表达式 class atag 该表达式适用于 div class atag div 但不适用于前面的示例 我怎样
  • Mac OSX、Emacs 24.2 和 nrepl.el 不工作

    我在用着nrepl el Emacs 24 2 我的 S O 版本是 OS X Lion 10 7 5 运行命令 M x nrepl启动后REPL会话通过lein lein repl 我能够连接到它 但如果我尝试使用 M x nrepl j
  • 在 Mac OS X 上使用链接描述文件

    有没有办法使用链接器脚本ld在 Mac OS X 上 The GNU ldLinux 上的程序接受 T
  • 如何使用 lxml、XPath 和 Python 从网页中提取链接?

    我有这个 xpath 查询 html body tbody tr td a title href 它提取所有带有标题属性的链接 并给出href in FireFox 的 Xpath 检查器插件 但是 我似乎无法将它与lxml from lx
  • 如何使用retofit2和RxAndroid取消请求

    我正在使用 Retrofit 2 0 和 Rx android 来加载我的 API 我遵循该部分RxJava Integration with CallAdapter at 这个网站而且效果很好 但是 我不知道如何取消可观察对象的加载请求
  • Bash 进度条[重复]

    这个问题在这里已经有答案了 我正在使用以下脚本来浏览 whois 中的大量域列表并找到注册商 对于服务器 DNS 迁移很有用 并且它工作正常 不过 为了方便起见 我想在其中加入一个进度条 这是我的脚本 如果可以改进请告诉我 bin bash
  • Asp.net MVC 3 使用 DataAnnotations 进行条件验证

    我正在使用 Asp net MVC 3 面临数据注释的验证问题 如下所示 我们在单独的库项目中维护模型 模型类层次结构如下 public class EditAlternateMailingAddressModel BaseModel pu
  • Spring MVC 将 ArrayList 传递回控制器

    我是春天的新手 我显示用户列表 每行都有一个用于删除用户的复选框 控制器 Controller public class AdminController Autowired private UserDao userDao RequestMa
  • 从 JList 中删除项目

    我有一个简单的 Jlist 其中包含来自List
  • WSAGetLastError() 只是 GetLastError() 的别名吗?

    在我的代码中 我有带有 I O 完成端口的异步 I O 对于读 写完成回调 我得到一个HANDLE 当然可以是套接字 文件句柄 命名管道等 因此 如果这样的例程出现问题 我想检查错误 但如何知道它是否是 网络 HANDLE a SOCKET
  • 在 Elixir 中查找代码点是否为大写

    我需要检测 Elixir 中的代码点是否为大写字母 我尝试检查它的值是否在范围内65 90但这对非拉丁大写字母失败 我也尝试过检查是否 String upcase cp cp 然而 这对非字母 即数字 标点符号 失败 我真的不想遍历整个 u
  • UIImageView,设置 ClipsToBounds 以及我的图像如何失去理智

    我正在开发一个 iOS 4 应用程序 我正在使用此代码UIImageView on an UITableViewCell cell photo contentMode UIViewContentModeScaleAspectFill cel
  • Hibernate 标准、整数和“like”

    我正在将一些 hql 语句迁移到 Criterias 现在我正在解决一个问题 实体属性是 Integer 类型 但我需要使用通配符搜索 所以在 hql 中我这样做 session createQuery from P1 where id l
  • 运行模拟器时 SQLiteConnection 数据库泄漏

    我正在运行模拟器并收到以下有关内存泄漏的错误 有趣的是 泄漏的数据库似乎是 Google gms 的数据库 而不是用户数据库 有谁知道如何修理它 谢谢 09 27 15 55 07 252 2058 2068 com google andr
  • 如何转到 vim 中所有缓冲区的最后一个编辑位置?

    很容易转到当前缓冲区中的最后一个编辑位置 看如何返回到 Vim 中最后一行之前编辑的行 更改列表是缓冲区本地的 每个缓冲区都有自己的更改列表 然而 我从最近编辑的缓冲区导航到另一个缓冲区是很常见的 并且以某种方式返回到原始缓冲区中的最后一个
  • 具有字节数组键和字符串值的 HashMap - containsKey() 函数不起作用

    我正在使用 HashMap byte 键和字符串值 但我意识到即使我使用相同的对象 相同的字节数组和相同的字符串值 myList put TheSameByteArray TheSameStringValue 到 HashMap 中 表仍然
  • 带计时器的 JPanel 动画(滑入)

    我正在尝试使用我制作的此类从侧面滑入 JPanel public class AnimationClass private int i private int y private JPanel panel private int xTo p