ボードゲームをプログラミングしようとしています。ゲーム ボードの画像を読み込み、その上に透明なグリッドを読み込みたいと考えています。画像を描画するカスタム パネルを作成し、それをレイヤー パネルにレベル 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);