我正在尝试用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();
}
}
注意:我通过将
JFrame
和gameContainer
的LayoutManager都设置为new GridLayout(1,1)
来使它起作用,但是问题是我不能在CornPanel上使用setLocation()
使其动画。如果有没有setLocation()
的方法,请告诉我。另外,我花了很多我认为对于诊断问题不是必需的代码-希望我没有花太多。 最佳答案
您的玉米面板未指定首选大小,因此布局管理器可能只是将其设置为0x0。
有一种将图标添加到窗格中的简便方法。 JLabel::JLabel(Icon)将创建一个标签,该标签具有指定的图像图标,并且具有合适的尺寸来容纳它。
如果确实需要比单个图像更复杂的东西,则您的JComponent实现应重写getPreferredSize()。
您还应该在jframe上调用“ pack”,以便它可以确定理想的显示尺寸。
其他一些与您的原始问题无关的评论:
您不应该将JFrame扩展为主框架,而只是创建一个新的JFrame实例并对其进行配置。
您应该在事件调度线程中进行工作。请参阅EventQueue,更具体地说,通读Lesson: Concurrency in Swing