添加到另一个 JPanel 时不显示 JPanel
JPanel not showing when added to another JPanel
我正在尝试在 Java 中创建一个游戏 - 该游戏将是一个二维滚动游戏。我有一个名为 CornPanel 的 class,它扩展 JPanel
并显示一棵玉米植物 - CornPanel
将在屏幕上移动。我知道 CornPanel
class 正在工作,因为当我将它直接添加到 JFrame
时它会显示出来。但是,当我尝试将 CornPanel
添加到另一个 JPanel
,然后将 JPanel
添加到 JFrame 时,CornPanel
不会显示。
这是我的 CornPanel
class(缩写 - 我取出了我很确定不会导致问题的东西):
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);
}
}
我的游戏class:
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)
来使其工作,但问题是我无法使用 setLocation()
在 CornPanel 上,以使其具有动画效果。如果有没有 setLocation()
的方法,请告诉我。另外,我删除了很多我认为对诊断问题没有必要的代码——希望我没有删除太多。
I know the CornPanel
class is working because it shows up when I add it directly to a JFrame
. However, when I try to add a CornPanel
to another JPanel
and then add that JPanel
to the JFrame
, the CornPanel
doesn't show up.
框架内容窗格的布局是 BorderLayout
,默认约束是 CENTER
,它拉伸组件以填充 space。
面板的默认布局是 FlowLayout
,它..不会拉伸组件以适应。
解决此问题的最佳方法是(首先)将 CornPanel
的 getPreferredSize()
方法重写为 return 合理的大小,然后将其添加到 layout/constraint当 space 多于所需时,它具有所需的行为。
您的 corn 面板未指定首选大小,因此布局管理器可能只是将其设置为 0x0。
有一种更简单的方法可以将图标添加到窗格中。 JLabel::JLabel(Icon) 将创建一个标签,其中包含指定的图像图标,并且大小适合容纳它。
如果您确实需要比单个图像更复杂的东西,那么您的 JComponent 实现应该覆盖 getPreferredSize()。
您还应该在您的 jframe 上调用 "pack",以便它计算出理想的显示尺寸。
其他一些与您的原始问题无关的评论:
- 您不应该为主框架扩展 JFrame,只需创建一个新的 JFrame 实例并对其进行配置即可。
- 您应该在事件调度线程中完成工作。参见 EventQueue and more specifically read through Lesson: Concurrency in Swing
我正在尝试在 Java 中创建一个游戏 - 该游戏将是一个二维滚动游戏。我有一个名为 CornPanel 的 class,它扩展 JPanel
并显示一棵玉米植物 - CornPanel
将在屏幕上移动。我知道 CornPanel
class 正在工作,因为当我将它直接添加到 JFrame
时它会显示出来。但是,当我尝试将 CornPanel
添加到另一个 JPanel
,然后将 JPanel
添加到 JFrame 时,CornPanel
不会显示。
这是我的 CornPanel
class(缩写 - 我取出了我很确定不会导致问题的东西):
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);
}
}
我的游戏class:
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)
来使其工作,但问题是我无法使用 setLocation()
在 CornPanel 上,以使其具有动画效果。如果有没有 setLocation()
的方法,请告诉我。另外,我删除了很多我认为对诊断问题没有必要的代码——希望我没有删除太多。
I know the
CornPanel
class is working because it shows up when I add it directly to aJFrame
. However, when I try to add aCornPanel
to anotherJPanel
and then add thatJPanel
to theJFrame
, theCornPanel
doesn't show up.
框架内容窗格的布局是 BorderLayout
,默认约束是 CENTER
,它拉伸组件以填充 space。
面板的默认布局是 FlowLayout
,它..不会拉伸组件以适应。
解决此问题的最佳方法是(首先)将 CornPanel
的 getPreferredSize()
方法重写为 return 合理的大小,然后将其添加到 layout/constraint当 space 多于所需时,它具有所需的行为。
您的 corn 面板未指定首选大小,因此布局管理器可能只是将其设置为 0x0。
有一种更简单的方法可以将图标添加到窗格中。 JLabel::JLabel(Icon) 将创建一个标签,其中包含指定的图像图标,并且大小适合容纳它。
如果您确实需要比单个图像更复杂的东西,那么您的 JComponent 实现应该覆盖 getPreferredSize()。
您还应该在您的 jframe 上调用 "pack",以便它计算出理想的显示尺寸。
其他一些与您的原始问题无关的评论:
- 您不应该为主框架扩展 JFrame,只需创建一个新的 JFrame 实例并对其进行配置即可。
- 您应该在事件调度线程中完成工作。参见 EventQueue and more specifically read through Lesson: Concurrency in Swing