站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题一个线程,做一个彩球随机变化的例子,请求帮助?

一个线程,做一个彩球随机变化的例子,请求帮助?

摘要: 一个线程,做一个彩球随机变化的例子,请求帮助?


以下是我写的源代码,这个程序的目的是要做到:
1,在JFrame面板中生成100由线程产生的圆;
2,每个圆的颜色都随机产生
3,每隔一段时间颜色自断闪烁;
当我做好源代码运行,报处异常:
Exception in thread -#34;main-#34; java.lang.NullPointerException
at java.awt.Container.addImpl(Container.java:1019)
at java.awt.Container.add(Container.java:351)
at Cirall.-#60;init-#62;(Cirall.java:38)
at Cirall.main(Cirall.java:50)
Press any key to continue...

程序源代码
import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Random;
import java.io.*;

class MyJpance extends JPanel implements Runnable{
Random rand=new Random();//产生随机数
public MyJpance(){
Thread st=new Thread(this);//创建线程
st.start();//运行线程
}
public void paintComponent(Graphics g){ //复写Graphics的paintComponent方法
g.setColor(new Color(rand.nextInt(255),rand.nextInt(255),rand.nextInt(255)));
g.fillOval(0,0,50,50);
}
public void run(){ //复写Run 方法
while(true)
{
try {
Thread.sleep(1000);
this.repaint();
}
catch (Exception ex) {
System.out.println(-#34;ss-#34;);
}
}
}
}
class Cirall extends JFrame{
MyJpance [] s=new MyJpance[100];//创建100个myjpace对像
public Cirall(){


for (int i = 0; i-#60;s.length; i++)
{
c.add(s[i]);//循环添加到容器中
}
setSize(800,600);
this.setTitle(-#34;画圆游戏-#34;);
this.show();
}

public static void main(String [] args){
//System.out.println (-#34;请输入你要打印多少个圆:-#34;);
//InputStreamReader rs=new InputStreamReader(System.in);
//java.io.BufferedReader read=new BufferedReader(rs);
//String str=read.readLine();
Cirall cir=new Cirall();
}
}


程序有点难看。。。给个我很久以前写的代码给你,那时没有学i/o流,命令行输入参数就行了

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.Random;

public class GameAge {
static int N = 3;
static int M = 100;
public static void main (String [] args) {
if (args.length == 1)
N = Integer.parseInt(args[0]);
else if (args.length == 2) {
N = Integer.parseInt(args[0]);
M = Integer.parseInt(args[1]);
}
MyFrame f = new MyFrame(N,M);
f.setSize(600,400);
f.setVisible(true);
}
}

class MyFrame extends JFrame {
int N;
int M;
public MyFrame(int N, int M) {
this.N = N;
this.M = M;
getContentPane().setLayout(new GridLayout(N,N));
for (int i = 0; i -#60; N*N; i++)
getContentPane().add(new MyPanel(M));
}
}

class MyPanel extends JPanel {
final int M;
Random r = new Random();

private static final Color [] colors = {
Color.black, Color.blue, Color.cyan,
Color.darkGray, Color.gray, Color.green,
Color.lightGray, Color.magenta, Color.orange,
Color.pink, Color.red, Color.white,
Color.yellow
};

public MyPanel(int M) {
this.M = M;
new Thread (new Runnable() {
public void run () {
while(true) {
MyPanel.this.repaint();
try{
Thread.sleep(MyPanel.this.M);
}catch(InterruptedException e) {

}
}
}
}).start();
}

public void paint(Graphics g) {

g.setColor(colors[r.nextInt(colors.length)]);
g.fillOval(0,0,getSize().width,getSize().height);
}
}


楼主,发现错误了,NullPointerException的异常通常是由于未初始化造成的,而且提示是说38行,就是“add(s[i])这一行,你在用s[i]之前并未初始化s[i],你只是在之前声明了一个数组(但是并未初始化),因此你只需在add(s[i])这一行上面再加一行,即:
for (int i = 0; i-#60;s.length; i++)
{
 s[i]=new MyJpance();
 add(s[i]);//循环添加到容器中
}
,另外我用的是JDK1.5,在编译时报告说“使用了过时的API”,我把this.show()改成了this.setVisible(true);
至此,编译运行成功。效果很好,楼主,你java学的不错哈,以后多交流。



↑返回目录
前一篇: 关于接口的一些疑问??? 回复都给分!!
后一篇: 关于验证码(在线顶呀!)