MASSIVE EDIT:我添加了更多的descritpion和代码。
我最近遇到一个问题,即我添加到另一个面板的面板无法正常显示(仅显示黑点而不是图像)。代码流程是:Menu类有一个按钮面板。按下按钮开始时,菜单将删除按钮面板,创建一个Board对象(该工具面板)并将其添加到Menu。在Board构造函数中,加载图像(.png),然后将PlayerPanel(实现面板)添加到板面板中。在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中的图像替换为黑点。
有任何帮助吗?谢谢!
答案 0 :(得分:2)
您的问题似乎是由于您的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());
}
它会准确地告诉你它们的大小及其组成的播放器面板。
要解决此问题,您可以为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交换视图,而不是调用remove(...)
,add(...)
,revalidate()
,repaint()