gpt4 book ai didi

java - 将 JPanel 分层,底层为背景图像

转载 作者:行者123 更新时间:2023-11-30 04:37:36 26 4
gpt4 key购买 nike

我正在尝试编写棋盘游戏程序。我想加载游戏板的图像,然后在其上加载透明网格。我编写了一个自定义面板来绘制图像,并将其添加到分层面板中作为级别 0。然后,我使用 GridLayout 创建一个 JPanel 并将其添加到级别 1。然后将分层 Pane 放入滚动 Pane 中,以考虑到背景图像有点大。希望让大部分网格在任何给定时间都是透明的,但如果玩家棋子进入一个正方形,那么我将将该正方形设置为代表该棋子的颜色。但是,当我将顶部面板设置为透明(通过调用 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);

最佳答案

  • 尝试像这样调用 super.paintComponent(..):

    @Override
    protected void paintComponent(Graphics g)
    {
    super.paintComponent(g);
    g.drawImage(image, 0, 0, null);
    }
  • 不要使用 appropriate LayoutManager 调用 JFrame#setSize(..)并覆盖 JPanelgetPrefferedSize(..) ,它将返回正确的大小,然后在 JFrame 上调用 pack() > 实例,然后将其设置为可见。

以下是 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);
}

}

关于java - 将 JPanel 分层,底层为背景图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13075269/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com