8

私はJava Swingをいじっていますが、JPanelとJComponentに関しては本当に混乱しています。CoreJava Vol 1 (cay horstmann) によると:

JComponent を拡張する代わりに、JPanel クラスを拡張することを好むプログラマーもいます。JPanel は、他のコンポーネントを格納できるコンテナとして意図されていますが、その上にペイントすることもできます。1つだけ違いがあります。パネルは不透明です。つまり、その境界内のすべてのピクセルをペイントする必要があります。これを実現する最も簡単な方法は、各パネル サブクラスの paintComponent メソッドで super.paintComponent を呼び出して、背景色でパネルをペイントすることです。

class NotHelloWorldPanel extends JPanel {
  public void paintComponent(Graphics g) {
    super.paintComponent(g);
    . . . // code for drawing will go here
  }
}

私は不透明なものを知っています。「パネルは不透明です..その境界内のすべてのピクセルをペイントする責任があります」とはどういう意味ですか? 私がそれを正しく読んだ場合、パネルはその境界内に独自の領域を描画すると言います.. JComponentもそうしませんか?

要するに、JPanel と JComponent の違いがわかりませんでした。私が本当にそれを見ることができる簡単な例はありますか?

どんな助けでも大歓迎です

4

1 に答える 1

6

JComponent は、バインドされたすべてのピクセルをペイントする必要はありません。背後にあるコンポーネントが見えるように、一部が透明になる場合があります。

すべてのピクセルをペイントするには、JPanel が必要です。

もちろんsuper.paintComponent(..)、どちらの場合もメソッドを呼び出さない場合は、JPanel がパネル全体をペイントするという保証を放棄するため、多かれ少なかれ同等になります。

つまり、違いは既存のメソッド (つまり、ペイント コンポーネント) にあります。

編集:

JComponent で実装されたボール クラスの例は、次のようになります。

(これは JPanel では機能しません。JPanel は不透明で、ボールの背景が正方形になるためです。 を呼び出すことはできませんsuper.paintComponentが、一般的な規則として、常に呼び出す必要があります。そうしないと、コンポーネントが実際に何であるかが壊れます。パスした場合JPanel を何かに変換する場合、JComponent のように動作するようにハッキングされた JPanel ではなく、JPanel であることが期待されます)

public class Ball extends JComponent
{
    public Ball(int x, int y, int diameter)
    {
        super();
        this.setLocation(x, y);
        this.setSize(diameter, diameter);
    }

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.setColor(Color.red);
        g.fillOval(0, 0, width, height);
    }
}
于 2013-10-01T17:39:16.680 に答える