实现小球不断往下滚动

代码1

复制代码
package jj;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class trtrispanel extends JPanel implements Runnable {
	//类成员
	public int ypos=-80;//小球坐上标
	//在类中添加私有成员
	private Image ibuffer;
	private Graphics gbuffer;
	
	public trtrispanel() {
		//创建新线程
		Thread t=new Thread(this);//创建新线程并
		t.start();//实现线程的启动,启动线程的内容是在run方法内
		
		// TODO Auto-generated constructor stub
	}
	@Override
	public void paint(Graphics g) {
		// TODO Auto-generated method stub
		super.paint(g);
		g.setColor(Color.red);
		g.fillOval(90, ypos, 20, 20);
	}
	@Override
	public void run() {//实现run方法使用while无线循环每隔30秒重绘
		// TODO Auto-generated method stub
		while (true) {
			try {
				Thread.sleep(30);//尝试每隔30秒重绘画面,若没有这份,重画动作执行的很快,就等不到其他功能的执行
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			ypos+=5;
			if (ypos>300) {
				ypos=-80;			
				
			} 
			repaint();
			
		}
		
	}

}

这里要讲的是这个小球的绘制,用paint方法实现小球的绘制,然后创建一个线程,重复repaint。清除页面上内容后

至于使用线程在您提供的两个代码片段中,第一个类 trtrispanel 是一个 JPanel 的子类,它实现了 Runnable 接口,这意味着它可以作为一个线程来运行。第二个类 mywindow 是一个 JFrame 的子类,它创建了一个窗口并添加了 trtrispanel 作为其内容面板。

以下是使用线程和不使用线程的主要区别:

使用线程(在 trtrispanel 中):

trtrispanel 类中有一个 run 方法,该方法在单独的线程中执行。这个方法包含了一个无限循环,它每隔30毫秒更新小球的 ypos 位置并重绘面板。

由于重绘操作是在单独的线程中进行的,用户界面(UI)不会因为 Thread.sleep(30); 而冻结。用户界面仍然可以响应用户操作,比如窗口移动、最小化或关闭。

小球会平滑地下落,因为 ypos 的更新和重绘操作是连续进行的。

不使用线程:

如果不使用线程,更新 ypos 和重绘操作将会在事件调度线程(EDT)中顺序执行。如果这些操作包含任何耗时的代码(比如 Thread.sleep(30);),那么整个应用程序的UI将会冻结,直到该操作完成。

用户界面将不会响应用户操作,直到 Thread.sleep(30); 完成。

小球的移动可能不会那么平滑,因为重绘操作将不会连续进行,而是会根据 Thread.sleep 的调用间隔进行。

在您的代码中,使用线程来更新UI是一个很好的实践,因为它可以保持应用程序的响应性。然而,需要注意的是,Swing组件必须在EDT上创建和更新。在您的 run 方法中,您调用了 repaint(),这是安全的,因为它最终会在EDT上调度重绘操作。但是,直接操作UI组件(比如直接调用 paintComponent 而不是 repaint)则必须在EDT上执行。

最后,确保在操作Swing组件时遵循线程安全规则,避免在非EDT线程中直接修改UI组件的状态。在您的代码中,通过调用 repaint() 而不是直接调用 paintComponent,您已经遵循了这个规则。

相关推荐
To_OC7 小时前
别再串行写 await 了,Promise.all 才是并行请求的正确打开方式
前端·javascript·promise
vipbic7 小时前
中后台越做越乱后,我用插件化把它救回来了
前端·vue.js
Hyyy8 小时前
Computer Use 适合做什么,不适合做什么——一次真实使用后的思考
前端
小和尚同志8 小时前
前端 AI 单元测试思考与落地
前端·人工智能·aigc
invicinble9 小时前
c端系统,其实更像一个信息展示平台
前端
李姆斯10 小时前
管理是否可以被完全量化
前端·产品经理·团队管理
名字还没想好☜11 小时前
Next.js 中间件实战:鉴权、重定向与 A/B 分流
开发语言·前端·javascript·中间件·react·next.js
广州灵眸科技有限公司11 小时前
瑞芯微RV1126B开发板(EASY-EAI-PI2) INI文件操作
java·前端·javascript·网络·人工智能
kaiking_g11 小时前
vue项目中,静态导入 vs 动态导入 详解
前端·javascript·vue.js
江华森11 小时前
Web 开发基础:HTTP 与 REST
前端·网络协议·http