将底层的JPanels分层为背景图像

时间:2012-10-25 18:51:57

标签: java swing jpanel paintcomponent jlayeredpane

我正在尝试编写棋盘游戏。我想加载游戏板的图像,然后在其上加载透明网格。我编写了一个自定义面板来绘制图像并将其添加到层次面板中作为级别0.然后我使用JPanel创建GridLayout并将其添加到级别1.然后将分层窗格放入滚动窗格,以说明背景图像有点大。希望大多数网格在任何给定时间都是透明的,但如果玩家棋子进入正方形,那么我将该正方形设置为代表该棋子的颜色。然而,当我将顶部面板设置为透明时(通过调用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是外框。它稍后会被设置为可见,所以这不是问题。

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); 

1 个答案:

答案 0 :(得分:2)

  • 请尝试调用super.paintComponent(..)

    @Override
    protected void paintComponent(Graphics g) 
    {
       super.paintComponent(g);
       g.drawImage(image, 0, 0, null);
    }
    
  • 请勿致电JFrame#setSize(..)使用appropriate LayoutManager并覆盖getPrefferedSize(..)的{​​{1}},这将返回正确的尺寸,然后在{{JPanel上调用pack() 1}}实例,然后将其设置为可见。

以下是JFrame课程的外观示例:

ImagePanel