-
关于repaint();类在多个线程里面无法调用paintComponent类5
小弟在这里给各位前辈鞠躬了
父类继承jpanel,第一个子类开始线程后调用this.repaint();有效 第二个子类开始线程后调用this.repaint();无效 ,上无效子类代码package com.yuanye.role;
import java.awt.AlphaComposite;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.JPanel;
import com.yuanye.util.ImageConst;
import com.yuanye.util.Particle;
public class Effect extends BaseRole implements Runnable{
private static List<Effect> bombList = new ArrayList<Effect>();
private int x;
private int y;
private WolfRole wolf;
private int spark_Idx;
private int wolf_fly_idx;
private int wolf_fly_idy;
private static int isEffect = 0;
private static int RCOK = 1;
private static int ICEEFFECT = 2;
private float i = 0.0f;
AlphaComposite alpha = AlphaComposite.SrcOver.derive(i);// 获得表示透明度的AlphaComposite对象
public Effect() {
new Thread(this).start();
}
public void paintSpark(Graphics g) {
g.drawImage(ImageConst.SPARK[spark_Idx], x, y, this);
}
public void paintComponent(Graphics g) {
System.out.println("1");
super.paintComponent(g);
/**
* 效果类List
*/
for (int i = 0; i < bombList.size(); i++) {
bombList.get(i).paintActoin(g);
}
}
// public void Run(){
// new Thread(this).start();
// }
public void paintIceEffect(Graphics g) {
g.drawImage(ImageConst.WOLF_FLY[wolf_fly_idx][wolf_fly_idy], x, y, this);
Graphics2D g2 = (Graphics2D) g;// 获得Graphics2D对象
g2.setComposite(alpha);// 指定AlphaComposite对象
g.drawImage(ImageConst.ICE_WOLF, x, y, this);
}
public void paintActoin(Graphics g) {
if (isEffect == RCOK) {
paintSpark(g);
}
if (isEffect == ICEEFFECT) {
paintIceEffect(g);
}
}
public Effect(int x, int y, int idx, int idy, int isspark, WolfRole wolf) {
this.x = x;
this.y = y;
this.wolf_fly_idx = idx;
this.wolf_fly_idy = idy;
isEffect = isspark;
this.wolf = wolf;
}
public void action() {
if (isEffect == RCOK) {
this.Spark();
}
if (isEffect == ICEEFFECT) {
this.IceWolf();
}
}
private void IceWolf() {
if (y < 500) {
if (i < 1.0f) {
System.out.println(i);
y -= 2;
i += 0.1f;
if(i > 1.0f){
i = 1.0f;
}
} else {
i = 1.0f;
this.y += 5;
}
} else {
bombList.remove(this);
}
alpha = AlphaComposite.SrcOver.derive(i);
}
private void Spark() {
if (spark_Idx < 2) {
this.spark_Idx++;
} else {
// this.bombList.remove(this);
isEffect = 0;
spark_Idx = 0;
}
}
public static List<Effect> getBombList() {
return bombList;
}
public static void setBombList(List<Effect> bombList) {
Effect.bombList = bombList;
}
@Override
public void run() {
while (true) {
for (int i = 0; i < Effect.getBombList().size(); i++) {
Effect.getBombList().get(i).action();
// bombList.get(i).repaint();
}
this.repaint();//就是这里
super.repaint();
try {
Thread.sleep(100);// 休眠150毫秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
小弟给各位前辈鞠躬了,感激不尽2012年3月04日 23:53
目前还没有答案
相关推荐
在多线程环境下,线程间的同步和通信是关键。Java提供了多种同步机制,如synchronized关键字、wait()、notify()和notifyAll()方法,以及java.util.concurrent包中的各种高级工具。如果企鹅的移动需要依赖其他线程的...
在paint()或paintComponent()方法中,使用Graphics对象绘制圆形,并在每个线程改变半径或位置后调用repaint()方法刷新视图。 最后,考虑到性能和用户体验,要优化线程的使用。避免过度创建线程,因为线程的创建和...
在Java编程中,线程是并发执行任务的基本单元,它允许程序同时处理多个任务,从而提高了系统的效率和响应性。本话题将深入探讨如何利用Java线程来实现一种常见的动态效果——滚动文字或字幕,这在多媒体软件、游戏...
3. **更新动画**:在一个单独的线程或`SwingWorker`中,定期调用`repaint()`方法,以重新绘制UI,从而实现动画效果。同时,这个线程也会更新每个雪花的位置,模拟下落的过程。 4. **线程同步**:由于涉及到UI更新,...
例如,我们可以为每个面板创建一个线程,然后在线程的`run()`方法中调用面板的`repaint()`方法,这将触发`paintComponent()`的调用,从而在后台线程中执行绘图操作。 为了确保线程安全,需要注意以下几点: 1. 在多...
`repaint`方法是Swing中少数几个线程安全的方法之一,可以在任意线程中调用。它的工作原理是向事件队列发送一个`PAINT`事件,由事件调度线程执行。 - **update方法**: 在AWT时代,`update`方法用于绘制组件的背景...
在"满天繁星"实验中,为了实现星星闪烁的效果,你可能需要创建多个线程,每个线程负责一颗星星的闪烁动画。Java中的Thread类或Runnable接口可以用来创建线程。你需要编写线程的run()方法,其中包含星星状态的改变...
每当小球的位置发生变化,`repaint()`会被调用,进而调用`paintComponent()`进行实际的绘制。 7. **设计模式**:在Java_Ball程序中,可能应用了一些设计模式,如单例模式(用于创建全局唯一的图形界面实例),或者...
定时器的回调函数会调用`repaint()`,触发`paintComponent()`的重绘,从而刷新屏幕。 7. **随机性**:为了让雪花的飘落显得自然,开发者可能会使用`java.util.Random`类生成随机的雪花大小、速度和飘落方向。这增加...
在这个场景下,可能有一个专门的线程负责更新星空状态,比如改变星星或月亮的位置,然后调用repaint方法使改变立即在屏幕上显示出来。 时间控制通常通过计时器(Timer)类来实现。Java Swing 提供了javax.swing....
我们可以创建一个`GameLoop`线程,负责不断检查游戏状态,更新物体位置,然后调用`repaint`方法通知GUI进行重绘。 在坦克大战中,地图的设计和碰撞检测也是关键部分。可以创建一个`Map`类存储地形信息,包括可移动...
在本项目中,我们看到一个实现,它在构造的面板上随机绘制了20个图形,这些图形是由`MyShape`抽象类及其多个子类来实现的。这种设计模式体现了面向对象编程的思想,使得代码可重用且易于扩展。 首先,让我们深入...
在贪吃蛇游戏中,我们可以创建多个类,如`Snake`类代表蛇,`Food`类代表食物,`GameBoard`类表示游戏面板,每个类都有其特定的属性和行为。 2. **继承与多态**:为了代码复用和扩展,可以设计一个基础的`Entity`类...
在这个坦克大战游戏中,开发者可能创建了多个线程,比如一个线程负责游戏逻辑的计算,另一个线程负责绘制界面,以保证游戏的流畅性。 尽管Java在游戏开发方面可能不如C++或Unity那样常见,但其强大的跨平台能力和...
为了不阻塞EDT,开发者可能使用了`javax.swing.Timer`类或者`java.lang.Thread`来创建一个新的线程,定期改变月亮的位置和星星的状态,然后调用`repaint()`方法来更新画面。 对于月亮的升起和降落,开发者可能使用...
- **游戏循环**:通过启动一个新的`PaintThread`线程来不断调用`repaint()`方法,使得游戏界面能够实时更新。 #### 坦克类 - **`GoodTank` 和 `BadTank`**:这两个类都实现了坦克的基本功能,如移动和射击。它们...
此外,可能还使用了`Timer`类或者`javax.swing.Timer`来定时调用`repaint()`方法,从而实现动态更新。 标签"java 钟表"表明这个程序的核心是关于Java编程,特别是与图形用户界面(GUI)和时间显示有关的。在实际...
`run`方法是线程执行的主要逻辑,它不断地更新`x`坐标,使文本向左移动,当文本移出可视区域时,我们将其重置到初始位置,然后调用`repaint`方法来触发组件的重新绘制,从而实现滚动效果。`Thread.sleep(50)`用于...
每次循环时,更新小球的位置,然后调用`repaint`方法让窗体重绘。 为了实现小球的反弹,我们需要检测小球是否碰到了窗口的边缘。这可以通过比较小球的边界与窗口边界进行计算得出。如果发生碰撞,就需要改变小球的x...
这可以通过继承javax.swing.Timer类来实现,Timer类可以定时触发指定的回调方法,在这个回调中,我们可以更新每片雪花的位置,然后调用JPanel的repaint方法,通知Swing组件需要重新绘制。 此外,我们还需要考虑雪花...