为什么paintComponent不能接受Graphics2D对象?

时间:2012-04-13 06:00:47

标签: java swing api awt paintcomponent

public class MyDrawPanel extends JPanel {
    public void paintComponent(Graphics g){

        Graphics2D gd2 = (Graphics2D) g;
        GradientPaint gradient = new GradientPaint(70,70,Color.blue,150,150,Color.red);


    }
}

为什么这有效但不是这样:

public class MyDrawPanel extends JPanel {
    public void paintComponent(Graphics2D g){

        GradientPaint gradient = new GradientPaint(70,70,Color.blue,150,150,Color.red);

        g.setPaint(gradient);
        g.fillOval(70,70,100,100);
    }
}

第一个呈现,但第二个呈现除帧之外的任何图形。我注意到paintComponent()需要一个Graphics对象,但如果Graphics2D是Graphics对象的子类,为什么我不能调用Graphics的子类?

是否有一些概念我不知道为什么会这样?

2 个答案:

答案 0 :(得分:2)

它说你应该这样实现它,因为Graphics2D是Graphics,而Graphics不是Graphics2D。

如果您发现施法令人不安,您可以随时创建自己的内容。扩展JPanel的MyJPanel,定义您自己的方法,并在将来对其进行子类化,覆盖您定义的方法。

public class MyJPanel extends JPanel {

    @Override
    protected void paintComponent(Graphics g) {
        paintComponent((Graphics2D) g);
    }

    protected void paintComponent(Graphics2D g) {
    }
}

答案 1 :(得分:1)

基本上,当你覆盖一个方法时,你可以同等或不那么具体。

想一想:

JPanel p = new MyPanel();
p.paintComponent(someGraphicsInstance);

JPanel的引用应该能够接受Graphics引用作为paintComponent方法的参数。但是,您的方法违反了该要求,因为它不接受Graphics个实例,只接受Graphics2D

有关此内容的更多信息,请访问https://stackoverflow.com/a/9950538/567864