2016-09-21 5 views
1

こんにちは、私は、Java GUIプログラミングの新人です。 Jframe(MainFrame)を作成し、JPanel(OutPanel)を追加しました。もう1つはJpanel(InnerPanel)です。私は描画InnerPanelの描画を達成しようとしています、OutPanelを描画していません。私はOutPanelがちょうどContainerであることを前提としています。あなたがTestAを見るように。私はGraphicsInnerPanelからOutPanelpaintComponent()に上書きします。getGraphics()メソッドを使用してイメージを一度読み込めません。

最後に、InnerPanelGraphicsOutPanelpaintComponent()の方法で描画することができます。それはうまく動作しませんでした。プログラム開始時にImageを1回描画することはできませんでした。私が窓を隠して見せてくれた時、プログラムはイメージを表示します。それはImageの一部ではありますが、すべてのImageではありません。

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.image.BufferedImage; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 


public class TestA{ 

    private static Image image = GUI.loadImage("PlayerBoard.jpg"); 


    public static void main(String[] args) { 
     TestA testA = new TestA(); 
    } 


    public TestA() { 

     JFrame mainFrame = new JFrame("Main Frame"); 
     mainFrame.setLayout(null); 
     mainFrame.setSize(500, 500); 
     mainFrame.setVisible(true); 
     mainFrame.setBackground(Color.black); 
     mainFrame.setLocation(800, 400); 

     OutPanel outPanel = new OutPanel(); 

     mainFrame.getContentPane().add(outPanel); 
     mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     outPanel.repaint(); 
    } 

    private class OutPanel extends JPanel { 

     JPanel innerPanel; 

     public OutPanel() { 

      this.setLayout(null); 
      this.setLocation(0, 0); 
      this.setSize(500, 50); 
      this.setBackground(Color.red); 

      innerPanel = new JPanel(); 
      this.innerPanel.setSize(400, 50); 
      this.innerPanel.setVisible(true); 
      this.add(innerPanel); 

     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      // TODO Auto-generated method stub 
      super.paintComponent(g); 

      int width = 500; 
      int height = 50; 

      BufferedImage resized = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB_PRE); 
      Graphics gBuffer = resized.createGraphics(); 
      gBuffer.drawImage(TestA.image, 0, 0, width, height, this); 

      Graphics gPanel = innerPanel.getGraphics(); 
      gPanel.drawImage(resized, 0, 0, width, height, this); 
     } 
    } 
} 

だから私は別の方法(TestB)を試してみてください。ちょうど別のものだけがdrawImage()メソッドとgetGraphics()のものをInnerPanelpaintComponent()からOutPanelpaintComponent()に移動しました。ここに別のコードテストBがあります。それはうまくいく。

これはなぜ発生しますか?それはcontextに関連していますか? Contextとは何ですか?私はInnerPanel'sOutPanelの画像を描くことができますか?

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Image; 
import java.awt.RenderingHints; 
import java.awt.image.BufferedImage; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.image.BufferedImage; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class TestB { 

    private static Image image = GUI.loadImage("PlayerBoard.jpg"); 

    public static void main(String[] args) { 
     TestB testB = new TestB(); 
    } 

    public TestB() { 

     JFrame mainFrame = new JFrame("Main Frame"); 
     mainFrame.setLayout(null); 
     mainFrame.setSize(500, 500); 
     mainFrame.setVisible(true); 
     mainFrame.setBackground(Color.black); 
     mainFrame.setLocation(800, 400); 

     OutPanel outPanel = new OutPanel(); 

     mainFrame.add(outPanel); 

     outPanel.repaint(); 

    } 

    private class OutPanel extends JPanel { 

     JPanel innerPanel; 

     public OutPanel() { 

      this.setLayout(null); 
      this.setLocation(0, 0); 
      this.setSize(500, 50); 
      this.setBackground(Color.red); 

      innerPanel = new InnerPanel(this); 
      this.innerPanel.setSize(500, 50); 
      this.innerPanel.setVisible(true); 
      this.add(innerPanel); 

      this.repaint(); 
     } 
    } 

    private class InnerPanel extends JPanel { 

     OutPanel outPanel; 

     public InnerPanel(OutPanel outPanel) { 
      this.outPanel = outPanel; 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      // TODO Auto-generated method stub 
      super.paintComponent(g); 

      int width = 500; 
      int height = 50; 

      Graphics2D g2d = (Graphics2D) g; 
      g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
      g.drawImage(TestB.image, 0, 0, width, height, this); 
     } 
    } 
} 
+0

'private static Image image = GUI.loadImage(" PlayerBoard.jpg ");' GUIのコードはどこにありますか?いずれにしても、 'static'を指定すると、' File'で画像をロードしようとしているだけです。アプリケーションリソースはデプロイ時に埋め込まれたリソースになるので、アクセスを開始するのが賢明です今のように、今すぐ。 [タグ:埋め込みリソース]は、ファイルではなくURLでアクセスする必要があります。 [info。埋め込みリソースのページ](http://stackoverflow.com/tags/embedded-resource/info)を参照してください。 –

+0

問題を解決するのに役立ちましたら[回答を受け入れてください](http://meta.stackexchange.com/a/5235/155831)してください。 –

答えて

2

コンポーネントのpaintComponent()メソッドは、それ自身を描画する責任があります。それは、他のコンポーネントを知らない、または気にするべきではありません。

私はOutPanelをコンテナにしました。

それだけです。パネルを作成し、外側のパネルのレイアウトマネージャを設定してから、外側のパネルをJFrameに追加します。

次に、インナーパネルを作成して外側のパネルに追加します。内側パネルのgetPreferredSize()メソッドをオーバーライドして、外側パネルのレイアウトマネージャがそのジョブを実行できるようにしてください。

詳細については、Custom PaintingのSwingチュートリアルのセクションを参照してください。

+0

あなたの答えをありがとう。つまり、外付けコンポーネントが追加コンポーネントの1つであってもわからないということですか? –

+0

@DoyoonKim、外側のコンポーネントは気にしません。 Swingは、コンポーネントとそのすべての子コンポーネントを自動的にペイントします。ペイントコードは、子(または親)コンポーネントではなく、ペイント自体について心配する必要があります。 – camickr

関連する問題