2012-09-17 95 views
3

我正在尝试制作游戏。游戏中有几个不同的屏幕,例如主菜单和实际的游戏屏幕。这些都是单独的jpanel扩展。我已经将它们添加到我的JFrame中,这是一个名为Game的类。在我的游戏类,我有以下方法在JPanels之间切换

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中是不允许的吗?

编辑:现在我打电话切换后重绘(),但它仍然没有工作

+0

没有触及这些在一段时间,但我认为你需要绘画/重画框架,如果你想看到它。 –

+1

也看cardLayout –

回答

8

你可以做许多不同的事情来达到同样的效果。

我会做的第一个建议是使用CardLayoutHow to Use CardLayout),因为这是它设计的目的。

另一个是使用一个JTabbedPaneHow to use Tabbed Panes

+0

是的,我认为cardLayout是要走的路。 –

+0

@SeanF它的目的是做你想做的,为什么重新发明轮子(我现在懒惰的日子;)) – MadProgrammer

+0

我想出了实际上,出于某种原因,我不得不打电话pack()每次我添加一个jpanel我的框架。我不能只添加它们,然后调用pack(),我必须在每个面板添加后调用它。奇怪的! –

1

如果你是一个游戏,你把它从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

1

如果要在两个面板之间切换,请将这些面板添加到另一个JPanel中并使用cardLayout。然后,在添加JPanel之前删除当前的一个。像这样:

parentPanel.removeAll(); 
parentPanel.repaint(); 
parentPanel.revalidate(); 

parentPanel.add(childPanel1); 
parentPanel.repaint(); 
parentPanel.revalidate(); 

同样地为其他子面板做同样的事情。