簡體   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