Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中面板显示中的面板_Java_Swing_Jpanel_Paintcomponent_Repaint - Fatal编程技术网

java中面板显示中的面板

java中面板显示中的面板,java,swing,jpanel,paintcomponent,repaint,Java,Swing,Jpanel,Paintcomponent,Repaint,大量编辑:我添加了更多描述和代码 我最近遇到一个问题,我添加到另一个面板的面板无法正确显示(只显示一个黑点而不是图像)。代码的流程是:Menu类有一个按钮面板。按下按钮开始时,菜单将移除按钮面板,创建一个板对象(实现面板)并将其添加到菜单中。在Board constructor中,加载图像(a.png),然后将PlayerPanel(实现面板)添加到Board面板。在PlayerPanl构造函数中,将加载图像。 计划是让menu repaint()方法能够调用Board paintcompone

大量编辑:我添加了更多描述和代码

我最近遇到一个问题,我添加到另一个面板的面板无法正确显示(只显示一个黑点而不是图像)。代码的流程是:Menu类有一个按钮面板。按下按钮开始时,菜单将移除按钮面板,创建一个板对象(实现面板)并将其添加到菜单中。在Board constructor中,加载图像(a.png),然后将PlayerPanel(实现面板)添加到Board面板。在PlayerPanl构造函数中,将加载图像。 计划是让menu repaint()方法能够调用Board paintcomponent。然后,董事会将要求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 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()
方法之类的繁琐操作。