【问题标题】:JPanel not showing when added to another JPanelJPanel 添加到另一个 JPanel 时不显示
【发布时间】:2025-12-31 16:15:11
【问题描述】:

我正在尝试用 Java 创建一个游戏 - 该游戏将是一个 2-D 滚动游戏。我有一个名为 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() 的情况下做到这一点,请告诉我。另外,我取出了很多我认为对诊断问题没有必要的代码——希望我没有取出太多。

【问题讨论】:

  • 添加cornPanel后是否尝试使用revalidate()方法>?

标签: java swing jpanel layout-manager


【解决方案1】:

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

有一种更简单的方法可以将图标添加到窗格中。 JLabel::JLabel(Icon) 将创建一个标签,其中包含指定的图像图标,并且大小合适。

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

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

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

  1. 您不应该为主框架扩展 JFrame,只需创建一个新的 JFrame 实例并对其进行配置。
  2. 您应该在事件调度线程中完成工作。请参阅EventQueue 并更具体地阅读Lesson: Concurrency in Swing

【讨论】:

  • 感谢汤普森先生。很高兴见到你!好久没上cljp了。
  • comp.lang.java.programmer 在usenet 上?哎呀,我什至多年来都没有听说过它。 ;) 最后我看到 - “Google 群组”引入了如此多的垃圾邮件,以至于它实际上已经死了。
  • 添加 getPreferredSize() 修复它!谢谢!
【解决方案2】:

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

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

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

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

【讨论】:

    最近更新 更多