2014-02-20 43 views
-1

我正在开发一款游戏,我正在使用CardLayout在同一个JFrame中的不同JPanel之间切换。在CardLayout中的多个JPanel之间切换

问题:我有一个helpPanel,我可以去推动main-menuPanel中的按钮并按下gamePanel中的按钮。

我想要什么: 我希望能够把一个JButtonhelpPanel那(当按下时)返回到主menuPanel或的GamePanel(取决于如果从主menuPanel或来自何方gamePanel)。

我已经试过:我在组合使用actionlistener试图用.previous(container parent),但只有把我带回到那个被添加到CardLayout在以前的helpPanel的位置JPanel。我也尝试嵌套actionListeners尝试并获得不同的情况,但没有奏效。

什么我搜索:我搜索过其他Questiones解决方案,但它总是在左右3.

代替2个不同JPanels之间切换谁能帮助我吗?我觉得这是一个非常困难的情况。

+0

为什么你只是不在某处存储一个字符串变量调用'previous'? – nachokk

回答

2

请阅读Swing教程How to Use Card Layout中的部分。它通过指定标识要显示的卡的字符串来演示如何在卡之间切换。

0

我最近一直在研究一个游戏菜单(你会看到这里的一些小部分),一种方法是为所有面板的按钮设置一个通用的ActionListener。然后将他们的动作命令设置为具有特定的字符串。在本例中, ,overallgame是主CardLayout面板。 GAME,信贷和主目录是用于标题板上的overallgame面板

ActionListener listener=new ActionListener() 
 
\t \t \t {public void actionPerformed(ActionEvent e){ 
 
\t \t \t \t if(e.getActionCommand().equals("start")){ 
 
\t \t \t \t \t //dummyframe.add(newgame); 
 
\t \t \t \t \t //mainmenupanel=null; 
 
\t \t \t \t \t CardLayout layout=(CardLayout)(overallgame.getLayout());//retrieves the overall layout 
 
\t \t \t \t \t layout.show(overallgame, GAME);//uses it to switch to main game panel 
 
\t \t \t \t \t newgame.requestFocus(true);//need to redirect focus to the game rather than original main menu 
 
\t \t \t \t \t dummyframe.repaint(); 
 
\t \t \t \t \t } 
 
\t \t \t \t else if(e.getActionCommand().equals("show credits")){ 
 
\t \t \t \t \t CardLayout layout=(CardLayout)(overallgame.getLayout()); 
 
\t \t \t \t \t layout.show(overallgame, CREDITS); 
 
\t \t \t \t \t } 
 

 
\t \t \t \t else if(e.getActionCommand().equals("switch to main")){ 
 
\t \t \t \t \t CardLayout layout=(CardLayout)(overallgame.getLayout()); 
 
\t \t \t \t \t layout.show(overallgame, MAIN_MENU); 
 
\t \t \t \t \t } 
 
\t \t \t \t 
 
\t \t \t \t else if(e.getActionCommand().equals("show chapter panel")){ 
 
\t \t \t \t \t CardLayout layout=(CardLayout)(overallgame.getLayout()); 
 
\t \t \t \t \t layout.show(overallgame, CHAPTERSTART); 
 
\t \t \t \t \t } 
 
\t \t \t \t else{ 
 
\t \t \t \t \t JOptionPane.showMessageDialog(null, "hey"); 
 
\t \t \t \t \t } 
 
\t \t \t \t } 
 
\t \t \t };​
里面你可以看到字符串常量,使用上述ActionCommands是特定字符串。你可以设置一个JButton,使其具有像这样的一行的“开始”ActionCommand(使用我的预定义的侦听器,它将切换到我的进行中游戏面板) ,导致NewGame JButton有一个ActionEvent ActionCommand,点击时“开始”。
NewGame.setActionCommand("start");​

,使面板具有可以由CardLayout使用的标题,你必须添加面板到CardLayout时来定义名称。这一行添加一个名为mainmenupanel的JPanel到我的整体游戏JPanel中,然后允许overallgame面板使用String常量MAIN_MENU引用它。

overallgame.add(mainmenupanel, MAIN_MENU);​
你可以看到,有条件地分析上重写的ActionListener您预先设定的ActionCommands来然后使用CardLayout显示一个特定的JPanel是做你想要什么好办法。 希望这会有所帮助!(我最近刚刚做了这个,所以我也有一段时间不知所措)。 如果我没有完全清除,可以随时发表评论以提出问题