当前位置: 首页 > news >正文

java 绘图球的移动_在Java上绘制2个朝不同方向移动的球,但一个消失了

小编典典

问题…

while-loop 在事件调度线程中,该线程可调整图形对象的位置

Thread.sleep在paint方法上。

不打电话 super.paintComponent

在paintComponent方法中更新对象的状态。

Swing使用一个单线程模型,该模型负责将重绘请求分派给所有组件。

在EDT中执行任何停止处理这些事件的操作,将防止Swing重新绘制UI。这将使您的动画看起来像突然从一个步骤到整个步骤都消失了。

我要强调第4点

您无法控制重绘周期。重涂请求可能是出于多种原因而提出的,这些原因并非您所要求的,这将导致您的对象无法控制或在您不希望被更新时被更新。您绝对不能从任何paint方法中更改UI的任何部分的状态。

简单的例子

这是一个非常简单的示例,但它演示了在Swing中制作任何动画时需要了解的基本概念

public class SimpleBouncyBall {

public static void main(String[] args) {

new SimpleBouncyBall();

}

public SimpleBouncyBall() {

EventQueue.invokeLater(new Runnable() {

@Override

public void run() {

try {

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

} catch (Exception ex) {

}

JFrame frame = new JFrame("Test");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.add(new CourtPane());

frame.pack();

frame.setLocationRelativeTo(null);

frame.setVisible(true);

}

});

}

public class CourtPane extends JPanel {

private Ball ball;

private int speed = 5;

public CourtPane() {

Timer timer = new Timer(40, new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

Rectangle bounds = new Rectangle(new Point(0, 0), getSize());

if (ball == null) {

ball = new Ball(bounds);

}

speed = ball.move(speed, bounds);

repaint();

}

});

timer.setRepeats(true);

timer.setCoalesce(true);

timer.start();

}

@Override

public Dimension getPreferredSize() {

return new Dimension(100, 100);

}

@Override

protected void paintComponent(Graphics g) {

super.paintComponent(g);

if (ball != null) {

Graphics2D g2d = (Graphics2D) g.create();

g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

Point p = ball.getPoint();

g2d.translate(p.x, p.y);

ball.paint(g2d);

g2d.dispose();

}

}

}

public class Ball {

private Point p;

private int radius = 12;

public Ball(Rectangle bounds) {

p = new Point();

p.x = 0;

p.y = bounds.y + (bounds.height - radius) / 2;

}

public Point getPoint() {

return p;

}

public int move(int speed, Rectangle bounds) {

p.x += speed;

if (p.x + radius >= (bounds.x + bounds.width)) {

speed *= -1;

p.x = ((bounds.x + bounds.width) - radius) + speed;

} else if (p.x <= bounds.x) {

speed *= -1;

p.x = bounds.x + speed;

}

p.y = bounds.y + (bounds.height - radius) / 2;

return speed;

}

public void paint(Graphics2D g) {

g.setColor(Color.RED);

g.fillOval(0, 0, radius, radius);

}

}

}

2020-11-01

相关文章:

  • php中购物车结算代码,jquery购物车结算功能实现方法
  • php.ini配置 耗时,配置PHP.INI监测服务器的脚本耗时
  • java自动生成测试与评估,jmeter如何自动生成测试报告
  • php memcached存储对象,从memcached获取对象并在PHP中设置为self
  • java阅读安卓,java – 如何在android中逐行阅读?
  • plotm matlab,MATLAB画地图的工具:worldmap和m_map
  • matlab不能盗版吗,matlab为了防止盗版,会不会篡改程序运行结果?这是明证
  • matlab 复权数据,〖Matlab〗基于通达信股价数据的复权处理(fantuanxiaot版本)
  • 微信小程序向php传递数据,微信小程序 跳转传递数据的方法
  • mysql8默认存储,MySQL 8.0安装
  • php berkeleydb,berkeleydb-5.1
  • matlab vs 打包exe文件路径,Matlab中調用VS編譯的exe文件並傳遞變量 的方法
  • php 访问受保护的属性,php – 我们应该直接访问受保护的属性还是使用getter?
  • PHP限制请求类型,Laravel :API 请求频率限制(Throttle中间件),自定义返回JSON类型,自定义时间...
  • oracle归档增长快,归档日志增长过快的问题
  • 3.7、@ResponseBody 和 @RestController
  • Angular Elements 及其运作原理
  • Iterator 和 for...of 循环
  • leetcode-27. Remove Element
  • STAR法则
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 聊聊flink的BlobWriter
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • kubernetes资源对象--ingress
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (二)pulsar安装在独立的docker中,python测试
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (四)JPA - JQPL 实现增删改查
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • (转载)从 Java 代码到 Java 堆
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .netcore 获取appsettings
  • .NET上SQLite的连接
  • .pyc文件是什么?
  • @requestBody写与不写的情况
  • [acwing周赛复盘] 第 69 场周赛20220917
  • [AIGC] Redis基础命令集详细介绍
  • [Android Studio] 开发Java 程序
  • [Angularjs]asp.net mvc+angularjs+web api单页应用
  • [BZOJ 4598][Sdoi2016]模式字符串
  • [C/C++]_[初级]_[关于编译时出现有符号-无符号不匹配的警告-sizeof使用注意事项]
  • [CISCN2019 华东南赛区]Web4
  • [codevs] 1029 遍历问题
  • [javaSE] 数据结构(二叉查找树-插入节点)
  • [Jenkins] Docker 安装Jenkins及迁移流程
  • [LeetCode]Multiply Strings
  • [oeasy]python0004_游乐场_和python一起玩耍_python解释器_数学运算
  • [one_demo_6]逆置整数
  • [python]使用pyqt5搭建yolov8 竹签计数一次性筷子计数系统
  • [RK-Linux] 移植Linux-5.10到RK3399(一)| 搭建系统并让系统跑起来