面板在java中的面板显示中

时间:2014-11-16 16:29:36

标签: java swing jpanel paintcomponent repaint

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中的图像替换为黑点。

有任何帮助吗?谢谢!

1 个答案:

答案 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()