先看代码import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.geom.*;public class GraphMov extends JFrame
{
protected GPanel pan;
public GraphMov()
{
super("GraphMov");
setSize(450,450);
pan=new GPanel();
add(pan);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}



class GPanel extends JPanel
{

public GPanel()
{
super();
setSize(400,400);
}

public void paint(Graphics g)
{
super.paint(g);
Graphics g2=getGraphics();
Mov m=new Mov(g2);
m.start();
}

class Mov extends Thread
{
Ellipse2D.Double ec;
int xb=50,yb=50;
Graphics2D g2d;
public Mov(Graphics g)
{
Graphics2D g2d=(Graphics2D)g;
}

public void run()
{
//while(xb<=300)
//{
ec=new Ellipse2D.Double(xb,yb,100,100);
g2d.draw(ec);
//for(int i=0;i<1000;i++){}
//xb++;yb++;
//}
}
}
}

public static void main(String[] args)
{
GraphMov frames=new GraphMov();
}
}
本人刚接触线程和图像类,上面代码本来是想实现这样的功能:用线程Mov再程序里画一个椭圆,代码通过javac,但是运行后Panel上没出现图形,想请问是什么问题?是JPanel类paint的Graphics传不进线程去吗?谢谢!

解决方案 »

  1.   

    你在Mov类的构造函数里没有能够给全局的g2d赋值public Mov(Graphics g)
                {
                    、Graphics2D去掉
                         g2d=(Graphics2D)g;
                }
      

  2.   

    の……汗死了原来是这个原因……谢谢喽。顺便多问一句:除了组件的paint()函数外,能不能再别的函数中创建Graphics对象???
      

  3.   

    Graphics对象都是通过组件的getGraphics方法来获取的吧,而且他是个抽象基类其他的不太清楚了
      

  4.   

    可以的
    比如你可以用一个Image对象得到一个graphics
    可以看看api中的Image