java如何实现多线程绘图

假如我要实现电子时钟,
clock extends JPanel
……
frame.add(clock);
frame.setVisible(true);
现在frame会调用paint方法,而paint方法是单线程的,所以必须要让clock的时分秒各起一个线程。 但如何让clock在调用paint方法时,触发时分秒线程的start方法?

首先,如果你只是要实现电子时钟,根本就不需要用到多线程。
如果你真的是要使用,就新建一个类,实现Runnable接口就是了。
如:
class MyThread1 implements Runnable{
public MyThread(){
}
public void run(){
}
}

使用的时候,就:
Thread myThread=new Thread(new MyThread());
myThread.start();

如果要画图,你就直接把组件通过构造方法传到MyThread中就是了追问

不用线程怎么做?

追答

你为什么要使用线程呢? try{ Thread.sleep(1000);}catch(Exception ex){System.exit(0);} 然后你再在这里的后面更新你的显示不就可以了吗?

追问

那分钟,小时怎么搞?换算成60*1000 3600*1000? 我做的时候很麻烦,因为两个数字显示的时间总是不同步,我想是因为两个在执行过程中产生了时间差,所以我准备用线程同步机制做。。

追答

亲,如果你是用JLable来显示的话,你不会:
hour.setText("**");
min.setText("**");
sec.setText("**");
把这些同时放在一个大括号里面不行吗??

追问

难道你是这个意思?while(true) {
Thread.sleep(1000);
t++;

if(t % 3600 == 0) {

hour.setText( (h+1)%24);
}

if(t % 60 == 0) {

min.setText((m+1)%60);
}

sec.setText((s+1)%60);
}好想法! 我一直想着每个时间都要一个时钟信号,谢谢了。 看来我的逻辑思维,数学思维能力有待提高。 但是话说回来,线程同步可以让另外两个线程阻塞,减少判断次数,也不错。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-12-07
你单线程就可以实现啦,你直接在paint函数中根据他们的规律以变量的形式画出三个指针,然后再用线程中的run()中实现每一秒钟重画一次如
public void run(){
while(true){
Thread.sleep(1000);
frame.repaint();
}
}
这样就可以了,我之前刚好也做过,初学者,如果有需要,我可以把我做的源代码给你。。。
第2个回答  2015-09-01
java中多线程的实现方式有两种,一种是继承java.lang.Thread类,另一种是实现java.lang.Runnable接口。
下面是两种方式的简单代码。
继承Thread类方式:import java.lang.Thread; //用集成Thread类方式实现多线程。 public class Test{ public static void main(String arg[]){ T t1=new T(); T t2=new T(); //更改新线程名称 t1.setName("t1"); t2.setName("t2"); //启动线程 t1.start(); t2.start(); } } class T extends Thread{ //重写run()方法 public void run(){ System.out.println(this.getName()); } }输出结果为:t1t2实现Runnable接口方式:在使用Runnable接口时需要建立一个Thread实例。因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例。import java.lang.*; //用实现Runnable接口的方式实现多线程。 public class Test{ public static void main(String arg[]){ T t1=new T(); T t2=new T(); //一定要实例化Thread对象,将实现Runnable接口的对象作为参数传入。 Thread th1=new Thread(t1,"t1"); Thread th2=new Thread(t2,"t2"); //启动线程 th1.start(); th2.start(); } } class T implements Runnable{ //重写run()方法 public void run(){ System.out.println(Thread.currentThread().getName()); } }输出结果为:t1t2public void run()方法是JAVA中线程的执行体方法,所有线程的操作都是从run方法开始,有点类似于main()方法,即主线程。
第3个回答  2015-10-18
例如,同时画两个图形;
import java.awt.Graphics;
import <a href="https://www.baidu.com/s?wd=java.awt.Color&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1YLuHIBnjDzmW6vrHTYnW9b0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6K1TL0qnfK1TL0z5HD0IgF_5y9YIZ0lQzqlpA-bmyt8mh7GuZR8mvqVQL7dugPYpyq8Q1f1nHbvrHRsPHDvPW6LPjnvP0" target="_blank" class="baidu-highlight">java.awt.Color</a>;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;

public class JFrameDraw2 extends JFrame{
public JFrameDraw2(){
super("Java画图程序");
setSize(600,500); //设置窗口尺寸
setVisible(true); //设置窗口为可视
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //关闭窗口时退出程序
addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e){
JFrameDraw2.this.repaint();
}
});
}

java.util.Random rnd = new java.util.Random();
public void paint(Graphics g){
super.paint(g);
int x1=150, y1=200, x2=60, y2=60;
for(int i=0; i<20; i++){
int ir=rnd.nextInt(0xff);
int ig=rnd.nextInt(0xff);
int ib=rnd.nextInt(0xff);
g.setColor(new Color(ir,ig,ib));
g.drawRect(x1, y1, x2, y2);
g.drawOval(x1+260, y1, x2, y2);
try{Thread.sleep(100);}catch(Exception eex){}
x1-=5;
y1-=5;
x2+=10;
y2+=10;

}
}

public static void main(String[] args){
new JFrameDraw2();
}
}
第4个回答  推荐于2018-03-13
使用javax.swing.Timer类
相似回答