import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class MainForm extends Frame implements Runnable{ /**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
new MainForm();
}
Graphics g;
public MainForm()
{
this.setBounds(100, 100, 800, 800); for(int i=0;i<=270;i+=90)
{
Thread th=new Thread(this);
th.setName(String.valueOf(0));
th.start();

}
g=this.getGraphics();
this.setVisible(true);
}

public void paint(Graphics e)
{
g=e;


}
public void run(){
String star=Thread.currentThread().getName();
int start=0;
for(int i=1;i<=90;i++)
{
                           //问题处在这里,这里的g报异常空值
g.drawArc(100, 100, 600, 600, start, i);

try {
Thread.sleep(10);
} catch (InterruptedException x) {
// TODO Auto-generated catch block
x.printStackTrace();
}
}
}这段代码目的是想在0.90.180.270 处利用多线程 同时绘制4段圆弧 然后连接 , 现在问题是g是空值 无法绘图  请指教或者给出解决办法代码也行 谢谢拉

解决方案 »

  1.   

    import java.awt.Frame;
    import java.awt.Graphics;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import java.util.Timer;
    import java.util.TimerTask;public class DrawArcTest {
    public static void main(String[] args){
    new ArcFrame();
    }
    }
    class ArcFrame extends Frame{
    int count=0;
    int flag=-2;
    public ArcFrame(){
    this.setSize(500, 500);
    this.setLocation(200, 200);
    this.addWindowListener(new WindowAdapter() { @Override
    public void windowClosing(WindowEvent e) {
    System.exit(0);
    }

    });
    TimerTask tk=new TimerTask() {
    public void run() {
    ArcFrame.this.repaint();
    }
    };
    Timer t=new Timer();
    t.schedule(tk, 0, 100);
    this.setVisible(true);
    }

    @Override
    public void paint(Graphics g) {
    if(count==90||count==0){
    flag=-flag;
    }
    count+=flag;
    g.drawArc(50, 50, 300, 300, 0, count);
    g.drawArc(50, 50, 300, 300, 90, count);
    g.drawArc(50, 50, 300, 300, 180, count);
    g.drawArc(50, 50, 300, 300, 270, count);
    }
    }
      

  2.   

    建议用java.swing.timer不要用java.util.timer,因为java.swing.timer会保证你的程序在一个EDT中。
      

  3.   

      if(count==90||count==0){
                flag=-flag;
            }
    这段没有用,count永远不会等于90或者0,count值是20递减的,即-20,-40,-80,-100...
    依照楼主的意思,把一楼的代码再改下:
    import java.awt.Frame;
    import java.awt.Graphics;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import java.util.Timer;
    import java.util.TimerTask;public class DrawArcTest {
        public static void main(String[] args){
            new ArcFrame();
        }
    }
    class ArcFrame extends Frame{
        int count=0;
        int flag=-2;
    Timer t;
        public ArcFrame(){
            this.setSize(500, 500);
            this.setLocation(200, 200);
            this.addWindowListener(new WindowAdapter() {            @Override
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
                
            });
            TimerTask tk=new TimerTask() {
                public void run() {
                    ArcFrame.this.repaint();
                }
            };
             t=new Timer();
            t.schedule(tk, 0, 100);
            this.setVisible(true);
        }
        
        @Override
        public void paint(Graphics g) {
            
            count+=flag;
            g.drawArc(50, 50, 300, 300, 0, count);
            g.drawArc(50, 50, 300, 300, 90, count);
            g.drawArc(50, 50, 300, 300, 180, count);
            g.drawArc(50, 50, 300, 300, 270, count);
    if(count == -80)t.cancel();
        }
    }count+=flag;
            g.drawArc(50, 50, 300, 300, 0, count);
            g.drawArc(50, 50, 300, 300, 90, count);
            g.drawArc(50, 50, 300, 300, 180, count);
            g.drawArc(50, 50, 300, 300, 270, count);
    if(count == -80) 
      

  4.   

    上面的最后:
    count+=flag; 
            g.drawArc(50, 50, 300, 300, 0, count); 
            g.drawArc(50, 50, 300, 300, 90, count); 
            g.drawArc(50, 50, 300, 300, 180, count); 
            g.drawArc(50, 50, 300, 300, 270, count); 
    if(count == -80)
    是多余的没复制好~
      

  5.   

    郁闷 还是没有我想要的  我想直接用thread绘图  不用timer  怎么都跑2楼去了
      

  6.   

    图形库基本都是用单线程的,Java的也是,所有的界面绘制操作都是事件派发线程中进行的,楼主的同时画线的想法很难实现,可以分开时间段来绘制,来模拟同时绘制的操作。
      

  7.   

    谢谢ls 呵呵 主要是那个Graphics对象的引用总是自动释放  所以无法在其他的方法里继续绘图