繁体   English   中英

将JPanel添加到另一个JPanel时不显示

[英]JPanel not showing when added to another JPanel

我正在尝试用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的LayoutManager设置为new GridLayout(1,1)来使其工作,但是问题是我不能在CornPanel上使用setLocation()使其动画。 如果有没有setLocation()的方法,请告诉我。 另外,我花了很多我认为对于诊断问题没有必要的代码-希望我没有花太多。

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

有一种将图标添加到窗格中的简便方法。 JLabel :: JLabel(Icon)将创建一个标签,该标签具有指定的图像图标,并且具有合适的尺寸来容纳它。

如果确实需要比单个图像更复杂的东西,则您的JComponent实现应重写getPreferredSize()。

您还应该在jframe上调用“ pack”,以便它可以确定理想的显示尺寸。

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

  1. 您不应该将JFrame扩展为主框架,而只是创建一个新的JFrame实例并对其进行配置。
  2. 您应该在事件调度线程中进行工作。 请参阅EventQueue ,更具体地说,请通读课程:Swing中的并发性

我知道CornPanel类正在工作,因为将其直接添加到JFrame时会显示出来。 但是,当我尝试将CornPanel添加到另一个JPanel并将该JPanel添加到JFrameCornPanel不会显示。

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

面板的默认布局是FlowLayout ,它不会拉伸组件以使其适合。

解决此问题的最佳方法是(首先)重写CornPanelgetPreferredSize()方法以返回合理的大小,然后将其添加到布局/约束中,该布局/约束在其空间超过所需空间时具有所需的行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM