Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么可以';paintComponent是否接受Graphics2D对象?_Java_Swing_Api_Awt_Paintcomponent - Fatal编程技术网

Java 为什么可以';paintComponent是否接受Graphics2D对象?

Java 为什么可以';paintComponent是否接受Graphics2D对象?,java,swing,api,awt,paintcomponent,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(Graphics g){

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


    }
}
第一个渲染,但第二个渲染帧以外的任何图形。我注意到paintComponent()需要一个图形对象,但是如果Graphics2D是图形对象的子类,为什么我不能调用图形的子类呢


有没有什么概念我不明白为什么会这样?

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

如果您发现强制转换令人不安,您可以始终创建自己的,例如扩展JPanel的MyJPanel,定义自己的方法,并在将来将其子类化,覆盖您定义的方法

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);
    }
}

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

如果您发现强制转换令人不安,您可以始终创建自己的,例如扩展JPanel的MyJPanel,定义自己的方法,并在将来将其子类化,覆盖您定义的方法

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);
    }
}

基本上,当您重写一个方法时,您可以同样或不那么具体

想想这个:

public class MyJPanel extends JPanel {

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

    protected void paintComponent(Graphics2D g) {
    }
}
JPanel
的引用应能够接受图形引用作为
paintComponent
方法的参数。但是,您的方法违反了该要求,因为它不接受
Graphics
实例,而只接受
Graphics2D


有关这方面的更多信息可以找到

基本上,当您重写一个方法时,您可以同样或不那么具体

想想这个:

public class MyJPanel extends JPanel {

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

    protected void paintComponent(Graphics2D g) {
    }
}
JPanel
的引用应能够接受图形引用作为
paintComponent
方法的参数。但是,您的方法违反了该要求,因为它不接受
Graphics
实例,而只接受
Graphics2D


有关这方面的更多信息,请参见

简短的回答是因为它比图形更具体,因此不是该方法的有效替代。它可以是同样或更少的具体,但不是更具体。它不是JPanel在其方法中指定为(图形g)的paintComponent的有效覆盖?实际上最近有一个问题对此进行了深入讨论。仔细看上面的答案。它应该解释为什么在重写一个方法时,你可以同样或不那么具体,但不能更具体。好的,我想我现在明白了,希望你把这个作为一个答案,那个链接对我来说几乎是答案。谢谢我继续写了下来,作为一个答案,并对你的情况做了一点解释。另外,据我所知,将图形实例强制转换到Swing组件内部的Graphics2D总是安全的。因为继承树(以及历史原因),它必须接受图形而不是图形2d。简单的回答是,它比图形更具体,因此不是有效的方法重写。它可以是同样或更少的具体,但不是更具体。它不是JPanel在其方法中指定为(图形g)的paintComponent的有效覆盖?实际上最近有一个问题对此进行了深入讨论。仔细看上面的答案。它应该解释为什么在重写一个方法时,你可以同样或不那么具体,但不能更具体。好的,我想我现在明白了,希望你把这个作为一个答案,那个链接对我来说几乎是答案。谢谢我继续写了下来,作为一个答案,并对你的情况做了一点解释。另外,据我所知,将图形实例强制转换到Swing组件内部的Graphics2D总是安全的。这是因为继承树(和历史原因)它必须接受图形而不是图形2D。这是因为JPanel是这样定义的?是的,当您现在定义方法时-使用Graphics2D,您只是重载了它,但您的JPanel不会调用它。谢谢,这和那个人一起为我澄清了更多的概念。和往常一样,你们在这里摇滚-DSo这是因为JPanel是这样定义的?是的,当你现在用Graphics2D定义你的方法时,你只是在重载它,但是你的JPanel没有调用它。谢谢你,这和这个人一起为我澄清了更多的概念。和往常一样,你们在这里摇滚-D