知道Graphics类是抽象类,但是通过JPanel.getGraphics()或JComponent.getGraphics()可以得到Graphics类的一个实例,但是JPanel.getGraphics()或JComponent.getGraphics()是怎么实现的呢?
或者说明怎样用另外的类来得到一个抽象类的实例,谢谢了。另外下面的程序中的public void paintComponent(Graphics g) 
    {
        super.paintComponent(g);
        g.setColor(Color.BLACK);
        g.fillArc(x,y, d, d,0,180);
        g.setColor(Color.WHITE);
        g.fillArc(x,y, d, d,180,180);
        g.setColor(Color.BLACK);
        g.fillArc(x+d/2, y+d/4, d/2, d/2,180,180);
        g.setColor(Color.WHITE);
        g.fillArc(x, y+d/4, d/2, d/2,0,180);
        g.fillOval(x+d*3/4-5, y+d/2-5, 10,10);
        g.setColor(Color.BLACK);
        g.fillOval(x+d/4-5, y+d/2-5, 10,10);
     }
    
这段代码中Graphics没有实例化,但是为什么可以调用它的方法呢?
急需知道,拜托了,谢谢。import javax.swing.*;
import java.awt.*;
public class Dao extends JFrame
{
  int width=400;
    int height=300;
   
   public Dao() 
    {
        setSize(width,height);//设置框架大小
        setTitle("道");//设置框架标题
        //将框架显示在屏幕正中
        Toolkit kit= Toolkit.getDefaultToolkit();
        Dimension screenSize=kit.getScreenSize();
        int x=(screenSize.width-width)/2;
        int y=(screenSize.height-height)/2;
        setLocation(x,y);//设置框架位置
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    
    public static void main(String args[]) 
    {
        Dao frame=new Dao();
        DrawPanel drawPanel=new DrawPanel( );
        //把其它组件添加到面板中;
        frame.setContentPane(drawPanel);
        frame.setVisible(true);
    }
    
}
class DrawPanel extends JPanel
{  

  int x=100;
    int y=40;
    int d=200;
   
    public  DrawPanel()
    {
        setBackground(Color.GRAY);
    }
    //在面板中绘制太极图形;
    public void paintComponent(Graphics g) 
    {
        super.paintComponent(g);
        g.setColor(Color.BLACK);
        g.fillArc(x,y, d, d,0,180);
        g.setColor(Color.WHITE);
        g.fillArc(x,y, d, d,180,180);
        g.setColor(Color.BLACK);
        g.fillArc(x+d/2, y+d/4, d/2, d/2,180,180);
        g.setColor(Color.WHITE);
        g.fillArc(x, y+d/4, d/2, d/2,0,180);
        g.fillOval(x+d*3/4-5, y+d/2-5, 10,10);
        g.setColor(Color.BLACK);
        g.fillOval(x+d/4-5, y+d/2-5, 10,10);
     }
    
  
}

解决方案 »

  1.   

    小伙,你需要多多读书!没有OOP编程思想啊。方法里面的东西是行参。参数只是接口,懂吗?接口或者虚类,实际上才标识着类的类型!这是一种思想!对对象模型化的思想。Graphics是一种接口,它没有实现,需要你继承实现,然后执行相应的方法。传入只需要传入类型。
    这个思想简单的说,就是操作类型,而不操作实例!是框架结构的一种设计思想。可以使程序,尤其是工具包灵活使用。
    //在面板中绘制太极图形; 
            public   void   paintComponent(Graphics   g)   
            { 
                    super.paintComponent(g); 
                    g.setColor(Color.BLACK); 
                    g.fillArc(x,y,   d,   d,0,180); 
                    g.setColor(Color.WHITE); 
                    g.fillArc(x,y,   d,   d,180,180); 
                    g.setColor(Color.BLACK); 
                    g.fillArc(x+d/2,   y+d/4,   d/2,   d/2,180,180); 
                    g.setColor(Color.WHITE); 
                    g.fillArc(x,   y+d/4,   d/2,   d/2,0,180); 
                    g.fillOval(x+d*3/4-5,   y+d/2-5,   10,10); 
                    g.setColor(Color.BLACK); 
                    g.fillOval(x+d/4-5,   y+d/2-5,   10,10); 
              } 
    这一段,它并没有真正意义上执行。因为最终在你给它一个实现了Graphics   g实例引用之前,它不会正常执行!就这么简单。面向对象编程,是针对接口编程。就如同list很多。我们不知道未来的list会是什么样。但是我们知道,这里一定传来的是list对象。那么我们把list声明成接口或者虚类,让用户自己实现get、set、next等等方法。而些程序时,最初的架构设计师,和流程设计师,是不考虑到底是objectList还是arrayList的,他们只管在真实要调用时,传来的是个list实现。和这个有些类似!
      

  2.   

    继承Graphics,重载续函数,并实现之后。你可以得到你想要的东西!