实现小球不断往下滚动

代码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,您已经遵循了这个规则。

相关推荐
程序视点1 小时前
Escrcpy 3.0投屏控制软件使用教程:无线/有线连接+虚拟显示功能详解
前端·后端
silent_missile1 小时前
element-plus穿梭框transfer的调整
前端·javascript·vue.js
专注VB编程开发20年1 小时前
OpenXml、NPOI、EPPlus、Spire.Office组件对EXCEL ole对象附件的支持
前端·.net·excel·spire.office·npoi·openxml·spire.excel
古蓬莱掌管玉米的神1 小时前
coze娱乐ai换脸
前端
GIS之路2 小时前
GeoTools 开发合集(全)
前端
咖啡の猫2 小时前
Shell脚本-嵌套循环应用案例
前端·chrome
一点一木2 小时前
使用现代 <img> 元素实现完美图片效果(2025 深度实战版)
前端·css·html
萌萌哒草头将军3 小时前
🚀🚀🚀 告别复制粘贴,这个高效的 Vite 插件让我摸鱼🐟时间更充足了!
前端·vite·trae
布列瑟农的星空3 小时前
大话设计模式——关注点分离原则下的事件处理
前端·后端·架构
yvvvy3 小时前
前端必懂的 Cache 缓存机制详解
前端