小弟今天刚接触多线程~因为太笨了~想了3个多小时还是没搞明白~
那未前辈有时间看下下面的代码~用线程实现眨眼睛。在这先谢谢了~~
import java.awt.*;
import javax.swing.*;
class Sle extends JFrame
{
JLabel jla = new JLabel();
public Sle()
{
super("娃娃");
this.setSize(400,300);
this.setVisible(true);
}
public void paint(Graphics g)
{
super.paint(g);
g.setColor(Color.BLUE);
g.fillOval(100,50,200,220);
g.setColor(Color.white);
g.fillOval(130,120,55,15);
g.setColor(Color.white);
g.fillOval(200,120,55,15);
g.setColor(Color.white);
g.fillOval(175,200,30,30);
g.setColor(Color.black);
g.fillOval(150,121,10,10);
g.setColor(Color.black);
g.fillOval(220,121,10,10);
g.setColor(Color.black);
g.drawLine(130,110,180,110);
g.drawLine(210,110,260,110);
g.drawLine(190,130,180,180);
g.drawLine(180,180,200,180);
}
public static void main(String [] args)
{
Sle ss = new Sle();
}
}
----------------解决方案--------------------------------------------------------
起一个线程去实现一个标量,然后在paint里面去根据标量画不同的画,这样就实现了动画的效果
不过,推荐使用paintComponent方法来画图,写一个继承自JPanel的类,它画出来的不会闪烁
然后再把JPanel加入到JFrame中去
----------------解决方案--------------------------------------------------------
标量?能解释一下吗?
----------------解决方案--------------------------------------------------------
比如一个boolean
你用线程去定时更改它,有时为true,有时为false
然后你在画的时候就判断,当为true时怎么画,当为false时怎么画
当然你也可以做其它的值做标量,比如,int值,定义了几个数字,比如123,为1时画什么,为2时画什么,为3时画什么,
123的值由线程来改,由paintComponent方法来取,
懂了不
----------------解决方案--------------------------------------------------------
嗯~~明白了~谢谢
我最开始想的是用fro循环
for(int i = 1;i<=1000000;i++)
{
if(i%2 ==1)
{
}
else
{
}
----------------解决方案--------------------------------------------------------
不是用循环,那样不会实现的
我帮你简单的改了一下,你看看吧
[CODE]import java.awt.*;
import javax.swing.*;
public class Sle extends JPanel implements Runnable {
private volatile boolean open;//此标量由线程去修改,由paintComponent方法去取得
public Sle() {
initWindow();
}
private void initWindow(){
JFrame jf=new JFrame("画人");
jf.add(this,BorderLayout.CENTER);
jf.setSize(400,400);
jf.setLocationRelativeTo(null);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
new Thread(this).start();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.BLUE);
g.fillOval(100,50,200,220);
if(open){
g.setColor(Color.white);
g.fillOval(130,120,55,15);
g.setColor(Color.white);
g.fillOval(200,120,55,15);
g.setColor(Color.white);
g.fillOval(175,200,30,30);
} else{
g.setColor(Color.RED);
g.fillOval(130,120,55,15);
g.setColor(Color.RED);
g.fillOval(200,120,55,15);
g.setColor(Color.white);
g.fillOval(175,200,30,10);
}
g.setColor(Color.black);
g.fillOval(150,121,10,10);
g.setColor(Color.black);
g.fillOval(220,121,10,10);
g.setColor(Color.black);
g.drawLine(130,110,180,110);
g.drawLine(210,110,260,110);
g.drawLine(190,130,180,180);
g.drawLine(180,180,200,180);
}
public static void main(String [] args) {
Sle ss = new Sle();
}
public void run() {
while(true){
try{
Thread.sleep(1000);
open=!open;
repaint();
} catch(Exception exe){
exe.printStackTrace();
}
}
}
}[/CODE]
----------------解决方案--------------------------------------------------------
虽然不自己没有写出来~
但还是学到了很多东西~看了你写的程序~在查了一下API就明白了
十分感谢冰封版主~~
----------------解决方案--------------------------------------------------------