2011-11-18 12 views
6

getGraphics()を呼び出すと、頻繁にxxx.getGraphics()を設定してもnullが返されます。 (Googleの検索が示すように...)xxxが見えるようにnullを返すgetGraphics()を呼び出す代替手段

しかし、これは動作しません、C-シャープで行うのは簡単でシンプルですので、これは私を失望させます。

getGraphics()を使用する代わりに誰かがこれを行うより良い方法を知っていますか?

+3

あなたに文脈を教えてもらえますか?恐らくあなたの問題を示す[sscce](http://www.sscce.org)が含まれています。 – mre

+1

コンポーネントを描画する方法をカスタマイズする場合は、 'paintComponent'をオーバーライドして描画コードを配置します。 – lhballoti

答えて

11

通常、コンポーネントがまだレンダリングされていない場合はnullになり、コンポーネントがレンダリングされ、返されたGraphicsオブジェクトがnullでない場合でも、Java SwingコンポーネントでgetGraphicsを使用する必要はありません。通常は寿命の短いオブジェクトになり、コンポーネントが再描画された場合(コントロール外のプロセス)は正しく動作しません。

もっと良い選択肢は、JComponentのpaintComponentメソッドを描画し、このメソッドに渡されたGraphicsオブジェクトをパラメータとして使用することです。背景イメージになるように描画する必要がある場合は、BufferedImageで描画を調べます。ここで画像にgetGraphics()(またはGraphics2Dオブジェクトが必要な場合はcreateGraphics())と呼びます。返されるオブジェクトは安定しています。このイメージは、paintComponentのGraphicsパラメータでGraphics#drawImage(....)を呼び出して、JLabelによって表示されるImageIconまたはJComponentのpaintComponentメソッドに表示されるImageのいずれかとして、何らかの形で表示する必要があります。

12

getGraphics()は使用しないでください。あなたが行う絵は一時的なものになり、次回Swingはコンポーネントを再描画する必要があると判断します。

カスタムペイントを行うには、代わりにJComponentまたはJPanelのpaintComponent()メソッドをオーバーライドします。詳細と例については、Custom Paintingを参照してください。