0 0

关于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多线程测试程序,

    在多线程环境下,线程间的同步和通信是关键。Java提供了多种同步机制,如synchronized关键字、wait()、notify()和notifyAll()方法,以及java.util.concurrent包中的各种高级工具。如果企鹅的移动需要依赖其他线程的...

    java 多线程制作动画

    在paint()或paintComponent()方法中,使用Graphics对象绘制圆形,并在每个线程改变半径或位置后调用repaint()方法刷新视图。 最后,考虑到性能和用户体验,要优化线程的使用。避免过度创建线程,因为线程的创建和...

    java线程之滚动的文字

    在Java编程中,线程是并发执行任务的基本单元,它允许程序同时处理多个任务,从而提高了系统的效率和响应性。本话题将深入探讨如何利用Java线程来实现一种常见的动态效果——滚动文字或字幕,这在多媒体软件、游戏...

    Java Swing 线程 下雪效果

    3. **更新动画**:在一个单独的线程或`SwingWorker`中,定期调用`repaint()`方法,以重新绘制UI,从而实现动画效果。同时,这个线程也会更新每个雪花的位置,模拟下落的过程。 4. **线程同步**:由于涉及到UI更新,...

    左手画圆,右手画方

    例如,我们可以为每个面板创建一个线程,然后在线程的`run()`方法中调用面板的`repaint()`方法,这将触发`paintComponent()`的调用,从而在后台线程中执行绘图操作。 为了确保线程安全,需要注意以下几点: 1. 在多...

    Java满天繁星课程实验

    在"满天繁星"实验中,为了实现星星闪烁的效果,你可能需要创建多个线程,每个线程负责一颗星星的闪烁动画。Java中的Thread类或Runnable接口可以用来创建线程。你需要编写线程的run()方法,其中包含星星状态的改变...

    java_ball.rar_java ba_lava ball

    每当小球的位置发生变化,`repaint()`会被调用,进而调用`paintComponent()`进行实际的绘制。 7. **设计模式**:在Java_Ball程序中,可能应用了一些设计模式,如单例模式(用于创建全局唯一的图形界面实例),或者...

    java 下雪的村庄

    定时器的回调函数会调用`repaint()`,触发`paintComponent()`的重绘,从而刷新屏幕。 7. **随机性**:为了让雪花的飘落显得自然,开发者可能会使用`java.util.Random`类生成随机的雪花大小、速度和飘落方向。这增加...

    java星月交替_java_

    在这个场景下,可能有一个专门的线程负责更新星空状态,比如改变星星或月亮的位置,然后调用repaint方法使改变立即在屏幕上显示出来。 时间控制通常通过计时器(Timer)类来实现。Java Swing 提供了javax.swing....

    (附详细Java代码及运行说明)手把手实现基于Java的坦克大战1.0版本:绘制坦克模型实现坦克移动

    我们可以创建一个`GameLoop`线程,负责不断检查游戏状态,更新物体位置,然后调用`repaint`方法通知GUI进行重绘。 在坦克大战中,地图的设计和碰撞检测也是关键部分。可以创建一个`Map`类存储地形信息,包括可移动...

    Java绘制2D图形

    在本项目中,我们看到一个实现,它在构造的面板上随机绘制了20个图形,这些图形是由`MyShape`抽象类及其多个子类来实现的。这种设计模式体现了面向对象编程的思想,使得代码可重用且易于扩展。 首先,让我们深入...

    Java 贪吃蛇

    在贪吃蛇游戏中,我们可以创建多个类,如`Snake`类代表蛇,`Food`类代表食物,`GameBoard`类表示游戏面板,每个类都有其特定的属性和行为。 2. **继承与多态**:为了代码复用和扩展,可以设计一个基础的`Entity`类...

    使用Swing开发的java版坦克大战小游戏.zip

    在这个坦克大战游戏中,开发者可能创建了多个线程,比如一个线程负责游戏逻辑的计算,另一个线程负责绘制界面,以保证游戏的流畅性。 尽管Java在游戏开发方面可能不如C++或Unity那样常见,但其强大的跨平台能力和...

    java写的月亮升起星星闪烁

    为了不阻塞EDT,开发者可能使用了`javax.swing.Timer`类或者`java.lang.Thread`来创建一个新的线程,定期改变月亮的位置和星星的状态,然后调用`repaint()`方法来更新画面。 对于月亮的升起和降落,开发者可能使用...

    一个显示钟表的小程序(jbuilder)

    此外,可能还使用了`Timer`类或者`javax.swing.Timer`来定时调用`repaint()`方法,从而实现动态更新。 标签"java 钟表"表明这个程序的核心是关于Java编程,特别是与图形用户界面(GUI)和时间显示有关的。在实际...

    Java基于线程实现带有滚动效果的Label标签实例

    `run`方法是线程执行的主要逻辑,它不断地更新`x`坐标,使文本向左移动,当文本移出可视区域时,我们将其重置到初始位置,然后调用`repaint`方法来触发组件的重新绘制,从而实现滚动效果。`Thread.sleep(50)`用于...

    java窗体内的弹性小球

    每次循环时,更新小球的位置,然后调用`repaint`方法让窗体重绘。 为了实现小球的反弹,我们需要检测小球是否碰到了窗口的边缘。这可以通过比较小球的边界与窗口边界进行计算得出。如果发生碰撞,就需要改变小球的x...

    Java桌面雪花

    这可以通过继承javax.swing.Timer类来实现,Timer类可以定时触发指定的回调方法,在这个回调中,我们可以更新每片雪花的位置,然后调用JPanel的repaint方法,通知Swing组件需要重新绘制。 此外,我们还需要考虑雪花...

    java-clock:简单实现给jpanel加一个本地钟表图片并在上面画出表针显示时间来练习多线程java

    在Java编程语言中,创建一个实时更新的钟表界面是一个典型的多线程问题。这个项目,"java-clock",旨在帮助开发者通过实践掌握Java中的多线程概念,并将其应用于GUI(图形用户界面)设计,具体来说是JPanel组件。在...

    Java弹跳球Applet

    在Java中,多线程是并发执行两个或多个任务的能力。在这个Applet中,使用了新的线程来处理球的运动逻辑,确保用户界面的响应性。这样,即使球在移动,用户仍可以与Applet进行其他交互。 6. **绘图和动画**: 要在...

Global site tag (gtag.js) - Google Analytics