Java 在JPanel之间切换
我想做个游戏。游戏中有几个不同的屏幕,如主菜单和实际的游戏屏幕。每一个都是一个单独的jpanel扩展。我已经将它们添加到我的JFrame中,这是一个名为Game的类。在我的游戏课上,我有以下方法Java 在JPanel之间切换,java,arraylist,jframe,jpanel,visible,Java,Arraylist,Jframe,Jpanel,Visible,我想做个游戏。游戏中有几个不同的屏幕,如主菜单和实际的游戏屏幕。每一个都是一个单独的jpanel扩展。我已经将它们添加到我的JFrame中,这是一个名为Game的类。在我的游戏课上,我有以下方法 public void addPanel( JPanel p ) { panels.add( p ); // An array of all the different panels I need this.getContentPane().add( p ); } public voi
public void addPanel( JPanel p ) {
panels.add( p ); // An array of all the different panels I need
this.getContentPane().add( p );
}
public void switchToPanel( JPanel p ) {
for ( JPanel somePanel : panels ) {
somePanel.setVisible( false );
}
p.setVisible( true );
repaint();
}
这一点是,我有许多不同的面板,当我需要显示一个特定的面板时,例如菜单屏幕,我调用SwitchTopPanel(myPanel)。基本上只是隐藏每个面板,然后取消隐藏我需要看到的面板。唯一的问题是,当我切换到这些面板时,它们并没有显示出来。唯一会出现的是我最后添加的面板。在Objective C中,我一直使用这种技术在视图之间切换,我从来没有遇到过任何问题。这种事情在java中是不允许的吗
编辑:现在我在切换后调用repaint(),但它仍然不起作用您可以做许多不同的事情来达到相同的效果 我的第一个建议是使用(),因为这是它的设计目的
另一种方法是使用()如果你正在制作一个游戏,你可以在一个不同于
EDT
的单独线程中制作它。大多数游戏通过不更改面板来显示不同的屏幕,但它们使用单个面板,并根据游戏状态
进行渲染
这里有一个例子
public class MyGame extends JPanel implements Runnable {
public static enum GameState {
MENU, INTRO, LEVELS, END, TITLES
}
GameState state = GameState.MENU;
public MyGame(){
setDoubleBuffered(true);
// Initialize the resources
new Thread(this).start();
}
public void update(long elapsedTime){
switch (state){
case MENU:
// Show the menu
break;
....
}
}
private void GameLoop(){
// Game Loop goes here
}
public void run(){
GameLoop();
}
public void paint(Graphics g){
// switch and draw your game
}
public static void main(String[] args){
JFrame f = new JFrame("MyGame");
f.setSize(640, 480);
f.add(new MyGame());
f.setVisible(true);
}
}
如果一个状态,即菜单完成,则更改
状态
变量。在你自己制作之前,先学习使用游戏引擎。如果你想在两个面板之间切换,请将这些面板添加到另一个JPanel并使用cardLayout。然后,在添加JPanel
之前,删除当前的一个。像这样:
parentPanel.removeAll();
parentPanel.repaint();
parentPanel.revalidate();
parentPanel.add(childPanel1);
parentPanel.repaint();
parentPanel.revalidate();
同样,对其他子面板也要这样做。有一段时间没有接触过这些,但我认为如果你想看到它,你需要对框架进行喷漆/重新喷漆。是的,我认为cardLayout是一个不错的选择。@Sean它是为了做你想做的,为什么要重新发明轮子(我现在很懒;))事实上我知道了,由于某些原因,每次向帧添加jpanel时,我都必须调用pack()。我不能只添加它们然后调用pack(),我必须在添加每个面板后调用它一次。奇怪@ChristianDaley小心使用pack()
。如果内容的大小改变,框架的大小也会改变。这可能不是您想要的效果。最好使用invalidate()
和repaint()
。。。或者CardLayout
哪种解决方案更好;)谢谢你的提示,但是我添加的所有jpanel都是用与我的主jframe相同的宽度和高度初始化的,并且宽度和高度都没有改变。