Java:Swing 的安全动画

2023-11-26

我正在创建一个使用 JFrame、JPanel、JLabel 和所有其他类型的 swing 组件的程序。

我想要做的是在专用于该动画的单独 JPanel 上创建 2D 动画。所以我将重写 PaintComponent (Graphics g) 方法。

我有使用 for 循环 + 线程制作动画的经验,但我听说线程对于 swing 不安全。

因此,使用 Runnable 接口制作动画是否安全?如果不是,我应该使用什么(例如计时器),请给出一个关于如何最好使用它的小例子(或网页链接)。

EDIT:

感谢 Jeff,我将使用 Timer 来创建动画。对于这个问题的未来观众,这是我在大约 5 分钟内编写的一个快速程序,请原谅脏代码。

我还添加了一些快速评论。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;


class JFrameAnimation extends JFrame implements ActionListener
{

    JPanel panel;
    Timer timer;
    int x, y;

    public JFrameAnimation ()
    {
        super ();
        setDefaultCloseOperation (EXIT_ON_CLOSE);
        timer = new Timer (15, this); //@ First param is the delay (in milliseconds) therefore this animation is updated every 15 ms. The shorter the delay, the faster the animation.
        //This class iplements ActionListener, and that is where the animation variables are updated. Timer passes an ActionEvent after each 15 ms.

    }


    public void run ()
    {

        panel = new JPanel ()
        {
            public void paintComponent (Graphics g)  //The JPanel paint method we are overriding.
            {
                g.setColor (Color.white);
                g.fillRect (0, 0, 500, 500); //Setting panel background (white in this case);
                //g.fillRect (-1 + x, -1 + y, 50, 50);  //This is to erase the black remains of the animation. (not used because the background is always redrawn.
                g.setColor (Color.black);
                g.fillRect (0 + x, 0 + y, 50, 50); //This is the animation.

            }

        }
        ;
        panel.setPreferredSize (new Dimension (500, 500)); //Setting the panel size

        getContentPane ().add (panel); //Adding panel to frame.
        pack ();
        setVisible (true);
        timer.start (); //This starts the animation.
    }


    public void actionPerformed (ActionEvent e)
    {
        x++;
        y++;
        if (x == 250)
            timer.stop (); //This stops the animation once it reaches a certain distance.
        panel.repaint ();  //This is what paints the animation again (IMPORTANT: won't work without this).
        panel.revalidate (); //This isn't necessary, I like having it just in case.

    }


    public static void main (String[] args)
    {
        new JFrameAnimation ().run (); //Start our new application.
    }
}

Jimmy,我认为您误解了 Swing 中线程的工作原理。您必须使用称为“事件调度线程”的特定线程来对 swing 组件进行任何更新(有一些特定的例外,我不会在这里讨论)。您可以使用摆动计时器来设置在事件调度线程上运行的重复任务。请参阅此示例了解如何使用 Swing 计时器。http://download.oracle.com/javase/tutorial/uiswing/misc/timer.html

您还应该阅读事件调度线程,以便了解它在 Swing 中的位置http://download.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html

Java 还提供了多种使用 Swing 的方法SwingUtilities类,特别是invokeLater and invokeAndWait它将在事件调度线程上运行代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java:Swing 的安全动画 的相关文章

  • 如何让Spring RabbitMQ创建一个新的队列?

    根据我对rabbit mq的 有限 经验 如果您为尚不存在的队列创建新的侦听器 则会自动创建该队列 我正在尝试将 Spring AMQP 项目与rabbit mq 一起使用来设置侦听器 但出现错误 这是我的 xml 配置
  • JavaFX Platform.runLater 的使用以及从不同线程访问 UI

    我有几个问题Platform runLater 我有一个 JavaFX 应用程序类 在这个类中 我运行一个线程 该线程从网络套接字读取数据 现在当我创建一个新的Stage在线程内部 系统抛出异常 JavaFX 事件调度程序线程和我的网络读取
  • 设置 SWT Shell 的默认字体

    有没有办法为整个 Shell 设置默认字体 以便任何新控件都将使用相同的字体 看来现在我必须为我创建的每个控件设置字体 这导致了太多的冗余 默认使用的字体由平台选择 请参阅中的其他信息 类字体 SWT 标准小部件工具包 http book
  • Java:高性能消息传递(单生产者/单消费者)

    我最初问这个问题here https stackoverflow com questions 3367192 java is while true loop in a thread bad whats the alternative 但我意
  • 对 Java 中 *any* 类的所有实例进行全排序

    我不确定以下代码是否能确保 Comparator 的 Javadoc 中给出的所有条件 class TotalOrder
  • @OneToMany 与 @JoinTable 错误

    我试图理解 OneToMany with JoinTable 对于这样的场景 我正在使用 JPA 2 1 Hibernate 5 0 4 和 Oracle 11 XE 当我打电话时userDao save user 下面的代码 我有 jav
  • 哈希码是否用于加速集合中的对象查找?

    IIUC 相同类型的两个不同对象可以存储在 HashSet 中 即使两个对象在以下情况下返回相同的值 hashCode 叫做 例如根据本文 https eclipsesource com blogs 2012 09 04 the 3 thi
  • 正确使用 JDBC 连接池 (Glassfish)

    我需要在 Java Web 服务中作为会话 bean 实现数据库连接 但我不确定我这样做是否正确 我创建了一个类 public final class SQLUtils private static DataSource m ds null
  • 如何在 Struts 2 OGNL 中将参数传递给方法调用

    我想使用属性作为对象方法的参数
  • BlackBerry SQLite:将一个 SQLite 数据库连接到另一个

    我正在尝试使用 SQLite 将一个 SQLite 数据库附加到 BlackBerry 上的另一个数据库附加数据库 http www sqlite org lang attach html命令 Database d1 d2 Statemen
  • Java 泛型:如何为泛型类型指定类类型?

    我有一个 POJO 指定为 MyClass u where U是泛型类型参数 我正在尝试编写一个接受类引用的实用方法Class u
  • SimpleDateFormat 将 lenient 设置为 false 时出现异常

    为什么这段代码会抛出无法解析日期的异常 SimpleDateFormat f new SimpleDateFormat yyyy MM dd T HH mm ss 000Z f setLenient false String dateStr
  • 不要模拟值对象:过于通用的规则,没有解释

    以下是 Mockito 单元测试框架的引用 不要模拟值对象 为什么有人会想要这样做呢 因为实例化对象太痛苦了 gt 无效 原因 如果创造新的装置太困难 那就是一个迹象 代码可能需要一些认真的重构 另一种方法是创建 价值对象的构建者 有一些工
  • 如何使用 Guava 连接字符串?

    我写了一些代码来连接字符串 String inputFile for String inputLine list inputFile inputLine trim 但我不能使用 连接 所以我决定使用 Guava 所以我需要使用Joiner
  • 抽象类或接口。哪种方式是正确的?

    有两种方法可以选择抽象类或接口 微软解决方案和Oracle解决方案 微软 设计指南 请使用抽象 在 Visual Basic 中为 MustInherit 类而不是接口来将协定与实现分离 http msdn microsoft com en
  • 为什么现在()? (客观化)

    为什么我想要异步加载 Objectify 实体 异步加载到底意味着什么 根据客观化有关加载的文档 https code google com p objectify appengine wiki BasicOperations Loadin
  • 战争库中的罐子爆炸

    我们可以将分解的 jar 文件放入 war web inf 库中吗 它在 JBOSS 4 2 中对我不起作用 我收到以下错误并且无法部署应用程序 Caused by javax management RuntimeOperationsExc
  • 在服务器内部调用 Web 服务

    我有一个网络服务 getEmployee 当传递 id 时 它会获取单个员工的员工详细信息 同一服务器上的另一个 Web 服务 getEmployeeList 当传递一个部门时 它会获取整个员工列表 这将获取部门的 ID 然后调用 getE
  • 如何从spark中的hbase表中获取所有数据

    我在 hbase 中有一个大表 名称为 UserAction 它具有三个列族 歌曲 专辑 歌手 我需要从 歌曲 列族中获取所有数据作为 JavaRDD 对象 我尝试了这段代码 但效率不高 有更好的解决方案来做到这一点吗 static Spa
  • 如何使用剪辑来减少绘画时间?

    我正在尝试使用 Clip 来减少 CPU 负载 但剪辑在屏幕上留下了一些我似乎无法摆脱的垃圾 另外 打开和关闭剪辑似乎对 CPU 负载没有影响 在任一情况下 大部分时间似乎都花在重绘管理器和绘制缓冲图像上 import static jav

随机推荐

  • C++和C#之间通过管道进行通信

    我想通过管道将数据从 C 应用程序发送到 C 应用程序 这是我所做的 这是 C 客户端 include stdafx h include
  • 为什么引入严格性的函数称为 seq?

    我明白了seq功能以及为什么有必要引入严格性以提高效率 我不明白的是 为什么这个原语被称为seq 与严格性无关 TL DR 米兰达称之为seq 它是在什么时候引入的sequence 可能 已经是 Monad 的事情了 并且 被称为stric
  • Angular/Chart.js 错误:无法创建图表:无法从给定项目获取上下文

    这确实是我第一次使用 Chart js 我将其导入到 Angular 组件中 我现在尝试创建一个简单的条形图 我的控制台中出现以下错误 core controller js 118 Failed to create chart can t
  • Heroku 上的 url_for with _external=True 不会在 URL 上附加服务器名称

    我已经在 Heroku 上部署了一个应用程序 但问题是当我的应用程序发送电子邮件时 它没有在 URL 中附加我的服务器名称 content Content text html verification email format user f
  • SQLite 架构信息元数据

    我需要获取 SQLite 数据库中的列名及其表 我需要的是一个包含 2 列的结果集 table name column name 在 MySQL 中 我可以通过数据库上的 SQL 查询来获取此信息INFORMATION SCHEMA 然而
  • opencv中如何合并轮廓?

    好的 我已经在这个项目上工作了一段时间了 我正在构建这个玩铬合金恐龙游戏的机器人 所以我尝试了其他方法来检测字符 例如 matchTemplate 甚至制作了自己的算法来定位对象 但我最喜欢这个 findcontours 这是我所拥有的 谁
  • 如何在 android 11 中的 /Android/media 中创建文件夹?

    我想在内部存储中创建一个新文件夹 但是在新版本的Android中 我们无法像以前创建文件夹一样创建文件夹了 但一些应用程序 例如 WhatsApp 会在 Android media 内创建文件夹 我想知道如何在此位置内创建文件夹 conte
  • Java 运行时.exec()

    我可以从命令行运行此命令 没有任何问题 验证脚本执行 c Python27 python feedvalidator feedvalidator src demo py https das dynalias org 8080 das cor
  • Heroku 中的 Django 错误:“请提供 ENGINE 值”

    我阅读并应用了 Heroku 上的 Django 入门 教程 但在同步数据库时遇到了问题 raise ImproperlyConfigured settings DATABASES is improperly configured djan
  • Angular4 材质输入无法正确显示

    我正在尝试将材质放入 angular4 项目中 在该项目中我用表格复制 粘贴了示例 当我输入客户名称时 编程部分按预期工作 它按应有的方式进行过滤 并且下表显示得非常好 问题是 mat form field 内的 matInput 未正确显
  • 使用 jQuery 检查是否至少选中了一个复选框

    我有五个复选框 使用 jQuery 我如何检查是否至少检查了其中之一
  • 显示更新时从 Flask 视图流式传输的数据

    我有一个可以生成数据并实时传输数据的视图 我不知道如何将此数据发送到可以在 HTML 模板中使用的变量 我当前的解决方案只是在数据到达时将其输出到空白页面 这是可行的 但我想将其包含在带有格式的更大页面中 当数据流式传输到页面时 如何更新
  • 如何使用 Python 获取 1200 英寸的 truetype 字体字符宽度?

    我可以使用 PIL 获取字符的高度和宽度 以像素为单位 见下文 但是 除非我弄错了 像素大小取决于屏幕的 DPI 它可能会有所不同 相反 我想做的是以绝对单位 例如英寸或 1200 英寸 wordperfect 单位 计算字符的宽度 gt
  • 在一个范围内选择一个范围

    我使用以下 VBA 代码 MS Excel 2010 选择给定范围内的一系列单元格 复制复制的单元格并将其插入回源范围 该范围从工作表中的第 2 行开始 一直到第 2200 行 从第 50 列到第 65 列 Set rngFEA shtTa
  • bazel支持测试执行顺序吗?

    我想在运行其他更深入的端到端测试之前运行一定数量的端到端集成测试 只要我不使用 keep going标记第一个测试失败应该退出bazel test 会议 我希望在更深入的测试之前运行更浅的端到端测试 有没有办法从 bazel 管理测试执行顺
  • 确定数独是否有唯一解

    我正在努力使用回溯算法来确定数独是否具有唯一的解决方案或是否具有多个解决方案 这是我使用的回溯代码 static boolean solve int i int j int cells if i 9 i 0 if j 9 return tr
  • 如何在 XML 视图中动态加载 XML 片段?

    假设我有以下 XML 视图
  • 使用 Jquery datepicker 添加选定日期的一天

    我一直在尝试为另一个日期字段添加一天 并选择当前字段的日期 onSelect function date var date2 currDate datepicker getDate date2 setDate date2 getDate 1
  • 仅使用 SQL 将图片插入 SQL Server 2005 图像字段

    使用 SQL Server 2005 和 Management Studio 如何将图片插入到Image键入表格的列 最重要的是我如何验证它是否存在 CREATE TABLE Employees Id int Name varchar 50
  • Java:Swing 的安全动画

    我正在创建一个使用 JFrame JPanel JLabel 和所有其他类型的 swing 组件的程序 我想要做的是在专用于该动画的单独 JPanel 上创建 2D 动画 所以我将重写 PaintComponent Graphics g 方