我正在尝试制作游戏。游戏中有几个不同的屏幕,例如主菜单和实际的游戏屏幕。每个都是一个单独的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 void switchToPanel( JPanel p ) {
for ( JPanel somePanel : panels ) {
somePanel.setVisible( false );
}
p.setVisible( true );
repaint();
}
关键在于我有许多不同的面板,当我需要显示特定的面板时,例如菜单屏幕,我调用switchToPanel(myPanel)。基本上只是隐藏每个面板,然后取消隐藏我需要看到的面板。唯一的问题是当我切换到它们时这些面板没有出现。唯一会出现的是我最后添加的面板。在Objective C中,我使用这种技术一直在视图之间切换,我从来没有遇到任何问题。 java中不允许这种事情吗?
编辑:现在我在切换后调用repaint(),但它仍然无法正常工作
答案 0 :(得分:9)
你可以做很多不同的事情来达到同样的效果。
我提出的第一个建议是使用CardLayout(How to Use CardLayout),因为这是它的目的。
另一种方法是使用JTabbedPane(How to use Tabbed Panes)
答案 1 :(得分:2)
如果您正在制作游戏,则可以在与EDT
不同的单独帖子中进行制作。大多数游戏通过不更改面板显示不同的屏幕,但他们使用单个面板,根据GameState
进行渲染。
这是一个例子。
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);
}
}
如果一个状态即菜单已完成,请更改state
变量。在您自己制作之前,首先要使用GameEngine
进行学习。
答案 2 :(得分:2)
如果要在两个面板之间切换,请将这些面板添加到另一个JPanel并使用cardLayout。然后,在添加JPanel
之前删除当前的一个。像这样:
parentPanel.removeAll();
parentPanel.repaint();
parentPanel.revalidate();
parentPanel.add(childPanel1);
parentPanel.repaint();
parentPanel.revalidate();
同样为其他子面板做同样的事情。