java中面板显示中的面板
大量编辑:我添加了更多描述和代码 我最近遇到一个问题,我添加到另一个面板的面板无法正确显示(只显示一个黑点而不是图像)。代码的流程是:Menu类有一个按钮面板。按下按钮开始时,菜单将移除按钮面板,创建一个板对象(实现面板)并将其添加到菜单中。在Board constructor中,加载图像(a.png),然后将PlayerPanel(实现面板)添加到Board面板。在PlayerPanl构造函数中,将加载图像。 计划是让menu repaint()方法能够调用Board paintcomponent。然后,董事会将要求PlayerPanel对组件进行喷漆。PlayerPanel绘制他的图像,Board绘制他的图像,就这样,两个图像都应该显示出来java中面板显示中的面板,java,swing,jpanel,paintcomponent,repaint,Java,Swing,Jpanel,Paintcomponent,Repaint,大量编辑:我添加了更多描述和代码 我最近遇到一个问题,我添加到另一个面板的面板无法正确显示(只显示一个黑点而不是图像)。代码的流程是:Menu类有一个按钮面板。按下按钮开始时,菜单将移除按钮面板,创建一个板对象(实现面板)并将其添加到菜单中。在Board constructor中,加载图像(a.png),然后将PlayerPanel(实现面板)添加到Board面板。在PlayerPanl构造函数中,将加载图像。 计划是让menu repaint()方法能够调用Board paintcompone
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 panel的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
为了解决这个问题,您可以为电路板提供一个布局管理器,用于扩展其组成组件,如BorderLayout。另一种可能的解决方案是为PlayerPanel提供自己的getPreferredSize()
方法覆盖,特别是如果您希望它根据自己的图像调整大小。e、 g
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
if (playerImage != null) {
g.drawImage(playerImage, 0, 0, null);
}
}
或者,您可以使用包含图像图标的JLabel,而不是在JPanel中绘制
注意,您应该使用CardLayout交换视图,而不是调用Swing组件的remove(…)
,add(…)
,revalidate()
,repaint()
,不要覆盖update(…)
。考虑创建和发布A。如果您只需要显示一个图像,请考虑在JLab签中包装图像。代码>面板。添加(新JLabel(新图像图标(图像))代码>而不是尝试重写update()
方法之类的繁琐操作。