gpt4 book ai didi

java - java中面板中的面板显示

转载 作者:行者123 更新时间:2023-12-02 05:15:48 27 4
gpt4 key购买 nike

大规模编辑:我添加了更多描述和代码。

我最近遇到一个问题,即我添加到另一个面板的面板无法正常显示(仅显示黑点而不是图像)。代码流程是:Menu 类有一个按钮面板。当按下按钮开始时,菜单删除按钮面板,创建一个 Board 对象(实现面板)并将其添加到菜单。在 Board 构造函数中,加载图像(.png),然后将 PlayerPanel(实现面板)添加到 Board 面板。在 PlayerPanl 构造函数中,加载图像。计划是使菜单 repaint() 方法能够调用 Board PaintComponent。然后,Board 将要求 PlayerPanel 绘制组件。 PlayerPanel 绘制他的图像,Board 绘制他的图像,就这样,两个图像都应该显示。

public class Menu extends JFrame implements ActionListener
{
Board theBoard;
JPanel pnlButton = new JPanel();
JButton btnStart = new Jbutton("Start");

public Menu(String s)
{
pnlButton.add(btnStart);
super.add(pnlButton);
super.setLocation(0,0);
super.setSize(600, 500);
super.setResizable(false);
super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
@Override
public void actionPerformed(ActionEvent evt)
{
if(evt.getSource() == btnStart)
{
theBoard = new Board ("TestBoard");
super.remove(pnlButton);
super.add(theBoard);
super.repaint();
}
}
}

public class Board extends JPanel
{
BufferedImage boardImage;
PlayerPanel playerPanel;
public Board (String boardName)
{
boardImage = Tools.loadImage(boardName);
playerPanel = new PlayerPanel();
this.add(playerPanel);
}

@Override
public void paintComponent(Graphics g)
{
g.drawImage(boardImage, 0, 200, null);
}
}

public class PlayerPanel extends JPanel
{
BufferedImage playerImage;

public PlayerPanel()
{
playerImage = Tools.loadImage("TestPlayer");
}

@Override
public void paintComponent(Graphics g)
{
g.drawImage(playerImage, 0, 0, null);
}
}

经测试,两个图像都成功加载,但是当从持有 Board 面板的 JFrame 调用 repaint() 时,仅绘制 Board 中的图像,而 PlayerPanel 中的图像被替换为黑点。

有什么帮助吗?谢谢!

最佳答案

您的问题似乎是由于 PlayerPanel JPanel 的大小造成的。有时,通过测试查看渲染时的大小有助于调试事物。例如,如果您将 Board PaintComponent 方法更改为:

@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
if (boardImage != null) {
g.drawImage(boardImage, 0, 200, null);
}

System.out.printf("Board size: [%d, %d]%n", getWidth(), getHeight());
System.out.printf("Player size: [%d, %d]%n", playerPanel.getWidth(), playerPanel.getHeight());
}

它会准确地告诉您其自身及其构成的playerPanel 的尺寸。

为了解决这个问题,您可以为 Board 提供一个布局管理器,以扩展其组成组件,例如 BorderLayout。另一种可能的解决方案是为 PlayerPanel 提供其自己的 getPreferredSize() 方法重写,特别是如果您希望它根据图像调整自身大小。例如,

@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
if (playerImage != null) {
g.drawImage(playerImage, 0, 0, null);
}
}

或者,您可以使用包含 ImageIcon 的 JLabel,而不是在 JPanel 中绘制。

注意,您应该与 CardLayout 交换 View ,而不是调用 remove(...)add(...)revalidate(), repaint()

关于java - java中面板中的面板显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26959250/

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