0

カスタムJLayeredPaneを使用しています。JLayeredPaneのさまざまなレイヤーに描画する必要のあるシェイプがいくつかあります。

これをテストするために、JPanelを作成し、そのグラフィックスを尋ねます。次に、そのJPanel(グラフィックの準備)にテスト長方形を描画し、JLayeredPaneのpaintComponentメソッドで最終的にすべてを描画します。しかし、これは失敗します(NullPointerException)。

public class MyCustomPanel extends JLayeredPane {

// test
JPanel testpane;
Graphics g2;
// test

// constructor
public MyCustomPanel() {
    testpane = new JPanel();
    this.add(testpane, new Integer(14));
    g2 = testpane.getGraphics();
}

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);

    g2.drawRect(10, 10, 300, 300);
}

}

// run:
//Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
//        at view.MyCustomPanel.paintComponent(MyCustomPanel.java:65)

JLayeredPane内からそのようなJPanelを利用できないのはなぜですか?paintComponentメソッド内からJLayeredPaneに直接描画できますが、これはJLayeredPaneのデフォルトのパネルにあります。JLayeredPaneに追加されたいくつかのレイヤーを作成して描画する必要があります。

私は何が間違っているのですか?:s

4

2 に答える 2

2

g2渡されたキャストを使用する必要がGraphicsあります。

Graphics2D g2 = (Graphics2D)g;

物事を切り離してみませんか?

class InnerPanel extends JPanel
{
  public void paint(Graphics g)
  {
     Graphics2D g2 = (Graphics2D)g;
     g2.drawRect(....);
  }
}

class MyLayered extends JLayeredPane()
{
  MyLayered()
  {
    this.add(new InnerPanel(), 14);
  }
}

これはもっと理にかなっています。

また、Swingの動作に同意しないことをしようとしているためです。Swingはそれ自体で、paint表示する必要のあるものに対して適切なメソッドを呼び出すように注意します。このプロトコルを使用するには、Swingがオブジェクト( )メソッドにGraphics要求したときに、オブジェクトに何を描画するかを指示する必要があります。 paint

このように、Swingがあなたを描きたいときはいつでも、Swingが適切なタイミングで適切なメソッドを呼び出すことを考慮せずに、他のものJLayeredPaneのオブジェクトに物を描くだけです。Graphic

結論として、必要なときにオブジェクトに何かを描くことはできません。GraphicSwingによって呼び出されたメソッド内でそれを行うことができます。それ以外Graphicsの場合、これらのオブジェクトは何の意味もありません。

于 2010-04-07T16:17:35.070 に答える
1

変数g2は、描画時ではなくコンストラクターで設定するため、おそらくnullです。代わりに、渡された「g」を使用してください。

現在ペイントされているコンポーネントからのみ、正規のグラフィックを取得できます。それ以外の場合は無効です。要求している時点では、MyCustomPanel()は表示されておらず、テストペインも表示されていません。

于 2010-04-07T16:14:17.210 に答える