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

最初のものはレンダリングしますが、2番目のものはフレーム以外のグラフィックをレンダリングしません。paintComponent()にはGraphicsオブジェクトが必要であることに気付きましたが、Graphics2DがGraphicsオブジェクトのサブクラスである場合、Graphicsのサブクラスを呼び出せないのはなぜですか?

なぜそうなのか、私が理解していない概念はありますか?

4

2 に答える 2

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) {
    }
}
于 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 に答える