0
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 的子类?

关于为什么会这样,有什么我没有理解的概念吗?

4

2 回答 2

2

它说你应该以这种方式实现它,因为 Graphics2D 是 Graphics,而 Graphics 不是 Graphics2D。

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

public class MyJPanel extends JPanel {

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

    protected void paintComponent(Graphics2D g) {
    }
}
于 2012-04-13T06:05:43.103 回答
1

基本上,当您覆盖一个方法时,您可以同样或更少具体。

想一想:

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

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

有关此的更多信息,请参见https://stackoverflow.com/a/9950538/567864

于 2012-04-13T06:14:11.750 回答