JPanel在添加到另一个JPanel时没有显示

时间:2015-06-22 23:10:43

标签: java swing jpanel layout-manager

我正在尝试用Java创建游戏 - 游戏将成为一个2D滚动游戏。我有一个名为CornPanel的类,它扩展JPanel并显示玉米植物 - CornPanel是将在屏幕上移动的内容。我知道CornPanel类正在运行,因为它会在我将其直接添加到JFrame时显示出来。但是,当我尝试将CornPanel添加到另一个JPanel,然后将JPanel添加到JFrame时,CornPanel不会显示。

这是我的CornPanel课程(缩写 - 我拿出的东西我很确定不会导致问题):

package game;

import java.awt.Graphics;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JPanel;

public class CornPanel extends JPanel{

    BufferedImage cornImage;

    public CornPanel(){
        loadImages();
    }

    public void loadImages(){
        try{
            cornImage = ImageIO.read(new File("src\\cornBasic.png"));
        } catch(IOException e){
            e.printStackTrace();
        }
    }

    protected void paintComponent(Graphics g){
        g.drawImage(cornImage, 0, 0, cornImage.getWidth(), cornImage.getHeight(), this);
    }
}

我的游戏课程:

package game;

import java.awt.Color;
import java.awt.Graphics;
import java.util.ArrayList;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JPanel;


public class Game extends JFrame{

    ArrayList<CornPanel> cornPanels;
    JPanel gameContainer;

    public Game(){
        cornPanels = new ArrayList<CornPanel>();
        gameContainer = new JPanel();
        setSize(1000, 1000);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBackground(new Color(98, 249, 255));
        setExtendedState(JFrame.MAXIMIZED_BOTH);
        getContentPane().add(gameContainer);

        addCornPanel();
        setVisible(true);
    }

    public void addCornPanel(){

        CornPanel cornPanel = new CornPanel();
        cornPanels.add(cornPanel);
        gameContainer.add(cornPanel);
        cornPanel.setVisible(true); 
        getContentPane().repaint();
        repaint();
    }


    public static void main(String[] args) {
        Game game = new Game();
    }
}

注意:我通过将JFramegameContainer设置为new GridLayout(1,1)的LayoutManager来实现它,但问题是我不能使用{{1}在CornPanel上,以使其具有动画效果。如果没有setLocation()有办法让我知道。另外,我拿出了很多我认为没有必要的代码来诊断问题 - 希望我没有拿出太多的代码。

2 个答案:

答案 0 :(得分:4)

您的玉米面板没有指定首选大小,因此布局管理器可能只是将其设置为0x0。

有一种更简单的方法可以将图标添加到窗格中。 JLabel::JLabel(Icon)将创建一个标签,该标签指定了图片图标,并且尺寸合适,可以容纳它。

如果确实需要比单个图像更复杂的东西,那么JComponent实现应覆盖getPreferredSize()。

你也应该在你的jframe上调用“pack”,这样它就可以找出理想的显示尺寸。

其他一些与您原始问题无关的评论:

  1. 您不应该为主框架扩展JFrame,只需创建一个新的JFrame实例并进行配置。
  2. 您应该在Event Dispatch Thread中完成工作。请参阅EventQueue,更具体地了解Lesson: Concurrency in Swing

答案 1 :(得分:2)

  

我知道CornPanel类正在运行,因为它会在我直接添加到JFrame时出现。但是,当我尝试将CornPanel添加到另一个JPanel,然后将JPanel添加到JFrame时,CornPanel不会显示

框架内容窗格的布局为BorderLayout,默认约束为CENTER,它会拉伸组件以填充空间。

面板的默认布局为FlowLayout,它不会拉伸组件以适应。

解决此问题的最佳方法是(首先)覆盖getPreferredSize()的{​​{1}}方法以返回合理的大小,然后将其添加到具有所需行为的布局/约束中比它需要更多的空间。