在CardLayout中切换多个JPanel

时间:2014-02-20 22:18:11

标签: java swing jpanel cardlayout

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

问题:我有一个帮助面板,我可以按下主菜单面板中的按钮并按下gamePanel中的按钮。

我想要的是什么: 我希望能够在JButton中放置helpPanel(按下时)返回主菜单面板或游戏面板(取决于你是来自主菜单面板还是来自gamePanel) 。

我尝试了什么:我尝试将actionlistener.previous(container parent)结合使用,但这只会让我回到JPanel添加到helpPanel之前位置的CardLayout。我也试过嵌套actionListeners试图获得不同的情况,但这不起作用。

我搜索的内容:我在其他问题中搜索了解决方案,但总是在2个不同的JPanels之间切换而不是3个。

有人能帮帮我吗?我发现这是一个非常困难的情况。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

我最近一直在制作游戏菜单(你会看到这里的点点滴滴),其中一种方法就是为所有面板按钮设置一个共同的ActionListener。然后将其操作命令设置为具有特定的字符串。 在此示例中,overallgame是主CardLayout面板。 GAME,CREDITS和MAIN-MENU是用于在整体游戏面板中标题面板的字符串常量



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

				else if(e.getActionCommand().equals("switch to main")){
					CardLayout layout=(CardLayout)(overallgame.getLayout());
					layout.show(overallgame, MAIN_MENU);
					}
				
				else if(e.getActionCommand().equals("show chapter panel")){
					CardLayout layout=(CardLayout)(overallgame.getLayout());
					layout.show(overallgame, CHAPTERSTART);
					}
				else{
					JOptionPane.showMessageDialog(null, "hey");
					}
				}
			};​



 如您所见,上面使用的ActionCommands是特定的字符串。你可以设置一个JButton,让ActionCommand像" start"用这样的一行(使用我预先定义的监听器,将使用我正在进行的游戏切换到面板) ,导致NewGame JButton拥有一个带ActionCommand的ActionEvent," start"点击时。


NewGame.setActionCommand("start");​




要使面板具有可由CardLayout使用的标题,您必须在将面板添加到CardLayout时定义名称。这一行将一个名为mainmenupanel的JPanel添加到我的totalgame JPanel中,然后允许totalgame面板使用String常量MAIN_MENU引用它。



overallgame.add(mainmenupanel, MAIN_MENU);​



 正如您所看到的,在重写的ActionListener上有条件地分析您预先设置的ActionCommands然后使用CardLayout来显示特定的JPanel是一种做您想做的事情的好方法。 希望这会有所帮助!(我最近也是这样做的,所以我也有一段时间不知所措)。 如果我不完全清楚,请随时发表评论