1

ボードゲームをプログラミングしようとしています。ゲーム ボードの画像を読み込み、その上に透明なグリッドを読み込みたいと考えています。画像を描画するカスタム パネルを作成し、それをレイヤー パネルにレベル 0 としてJPanel追加GridLayoutしました。ちょっと大きい。グリッドの大部分を常に透明にすることを望んでいますが、プレーヤーのピースが正方形に入った場合、その正方形をピースを表す色に設定します。ただし、トップパネルを透明に設定すると(を呼び出してsetOpaque(false))、白い背景が表示され、画像が表示されません。どうしてこれなの?

public class ImagePanel extends JPanel
{
   private Image image;

   public ImagePanel(Image image) 
   {
      this.image = image;
      this.setPreferredSize(new Dimension(936,889));
    }

   protected void paintComponent(Graphics g) 
   {
      g.drawImage(image, 0, 0, null);
   }
}

パネルを作成してネストするメイン プログラムのコードを次に示します。backBoard は外枠です。後で setVisible になるので問題ありません。

BufferedImage boardImage = null;
       try
       {
           boardImage = ImageIO.read(new File("Clue Board.jpg"));
       }
       catch(IOException e)
       {

       }

   ImagePanel background = new ImagePanel(boardImage); //load clue board image

   JPanel gameBoard = new JPanel (new GridLayout(24,24)); //yet to add actual squares
   gameBoard.setSize(936,889);
   gameBoard.setOpaque(false);

   JLayeredPane lPane = new JLayeredPane();
   lPane.setPreferredSize(new Dimension(936,889));
   lPane.add(background, new Integer(0));
   lPane.add(gameBoard, new Integer(1));

   JScrollPane layerScroller = new    JScrollPane(lPane,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
   backBoard.add(layerScroller, BorderLayout.CENTER); 
4

1 に答える 1

2
  • super.paintComponent(..)次のように呼び出してみてください:

    @Override
    protected void paintComponent(Graphics g) 
    {
       super.paintComponent(g);
       g.drawImage(image, 0, 0, null);
    }
    
  • 正しいサイズを返す適切なオーバーライドをJFrame#setSize(..)使用して呼び出さないでください。次に、インスタンスを表示する前に呼び出します。LayoutManagergetPrefferedSize(..)JPanelpack()JFrame

ImagePanelクラスの外観の例を次に示します。

public class ImagePanel extends JPanel
{
    private int width,height;
    private Image image;

    public ImagePanel(Image image) 
    {
          this.image = image;

          //so we can set the JPanel preferred size to the image width and height
          ImageIcon ii = new ImageIcon(this.image);
          width = ii.getIconWidth();
          height = ii.getIconHeight();
     }

     //so our panel is the same size as image
     @Override
     public Dimension getPreferredSize() {
          return new Dimension(width, height);
     }

     @Override
     protected void paintComponent(Graphics g) 
     {
        super.paintComponent(g);
        g.drawImage(image, 0, 0, null);
     }

}
于 2012-10-25T18:54:57.207 に答える