实现小球不断往下滚动

ops/2025/1/19 21:36:35/

代码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}@Overridepublic void paint(Graphics g) {// TODO Auto-generated method stubsuper.paint(g);g.setColor(Color.red);g.fillOval(90, ypos, 20, 20);}@Overridepublic void run() {//实现run方法使用while无线循环每隔30秒重绘// TODO Auto-generated method stubwhile (true) {try {Thread.sleep(30);//尝试每隔30秒重绘画面,若没有这份,重画动作执行的很快,就等不到其他功能的执行} catch (InterruptedException e) {// TODO Auto-generated catch blocke.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,您已经遵循了这个规则。


http://www.ppmy.cn/ops/151485.html

相关文章

Web小练习01

#制作简易网页# 本章包括主页、注册页面、登陆页面 主页 1.1主页代码如下 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1…

Jmeter进行http接口并发测试

目录&#xff1a; 1、Jmeter设置&#xff08;1&#xff09;设置请求并发数&#xff08;2&#xff09;设置请求地址以及参数&#xff08;3&#xff09;添加结果数 2、启动看结果 1、Jmeter设置 &#xff08;1&#xff09;设置请求并发数 &#xff08;2&#xff09;设置请求地址…

【STM32-学习笔记-11-】RTC实时时钟

文章目录 RTC实时时钟一、RTC简介二、RTC框图三、RTC基本结构四、RTC操作注意事项五、RTC函数六、配置RTCMyRTC.c 七、示例&#xff1a;实时时钟①、main.c②、MyRTC.c③、MyRTC.h RTC实时时钟 一、RTC简介 RTC&#xff08;Real Time Clock&#xff09;实时时钟 RTC是一个独立…

算法:带头结点的单链表原地逆置

核心思想&#xff1a;借助两个指针 #define _CRT_SECURE_NO_WARNINGS#include <stdio.h> #include <stdlib.h>//单链表结构体定义 typedef int ElemType; typedef struct Node {ElemType data;struct Node* next; }LNode, *LinkList;//尾插法建立带头结点的单链表…

《Compact Convolutional Transformers:开启计算机视觉新篇》

一、从 Transformer 到 CCT 的变革之路 在人工智能的浩瀚星空中&#xff0c;Transformer 模型宛如一颗璀璨的超新星&#xff0c;自 2017 年在论文《Attention Is All You Need》中横空出世后&#xff0c;彻底改写了自然语言处理的格局。它以创新性的自注意力机制&#xff0c;巧…

阿里云 Serverless 助力盟主直播:高并发下的稳定性和成本优化

在直播场景中&#xff0c;阿里云 Serverless 应用引擎 SAE 提供的无缝弹性伸缩与极速部署能力&#xff0c;确保直播间高并发时的流畅体验&#xff0c;降低了我们的运营成本&#xff0c;简化了运维流程。结合阿里云云原生数据库 PolarDB 的 Serverless 能力&#xff0c;实现了数…

API接口到底是什么

目录 一、API概述 二、API接口的定义与基本概念 &#xff08;一&#xff09;什么是API接口 &#xff08;二&#xff09;API接口的组成要素 &#xff08;三&#xff09;API接口的类型 Web API 库API 远程API 三、API接口的工作原理 &#xff08;一&#xff09;请求与响…

StarRocks 怎么让特定的SQL路由到FE master节点的

背景 本文基于 StarRocks 3.1.7 大家都知道对于Starrocks来说 FE 是分 master和follower的&#xff0c;而只有master节点才能对元数据进行写操作。但是为什么呢&#xff1f;哪里有体现呢&#xff1f; 这其中的原因在网上是搜不到的&#xff0c;所以大家只知道只有master节点才…