Java 导航到CardLayout中以前可见的卡
我有一张带有Java 导航到CardLayout中以前可见的卡,java,swing,user-interface,arraylist,cardlayout,Java,Swing,User Interface,Arraylist,Cardlayout,我有一张带有卡片布局的表单。在这个布局中,我有很多卡片。一切都很顺利,直到我不得不创建一种方法,通过使用按钮xclixck“移动到上一个xcarsd”。CardLayout默认的next()和back()都是无用的,因为我不知道用户将如何进入特定的卡 因此,我尝试管理一个被导航的卡片列表,并在单击按钮时将其向后移动。下面是我的实现 private List<String> goBackListHolder = new ArrayList<String>();
卡片布局的表单
。在这个布局中,我有很多卡片。一切都很顺利,直到我不得不创建一种方法,通过使用按钮xclixck“移动到上一个xcarsd”。CardLayout默认的next()
和back()
都是无用的,因为我不知道用户将如何进入特定的卡
因此,我尝试管理一个被导航的卡片列表,并在单击按钮时将其向后移动。下面是我的实现
private List<String> goBackListHolder = new ArrayList<String>();
private int firstPage = 0;
//Listeners
private class AddNewClientsBtnAction extends MouseAdapter
{
@Override
public void mouseClicked(MouseEvent e)
{
CardLayout card = (CardLayout)mainPanelHolder.getLayout();
card.show(mainPanelHolder, "new_client_form");
goBackListHolder.add("new_client_form");
firstPage++;
}
}
private class AddProviderBtnAction extends MouseAdapter
{
@Override
public void mouseClicked(MouseEvent e)
{
CardLayout card = (CardLayout)mainPanelHolder.getLayout();
card.show(mainPanelHolder, "new_provider_form");
goBackListHolder.add("new_provider_form");
firstPage++;
}
}
private class AddIntroducerBtnAction extends MouseAdapter
{
@Override
public void mouseClicked(MouseEvent e)
{
CardLayout card = (CardLayout)mainPanelHolder.getLayout();
card.show(mainPanelHolder, "new_introducer_form");
goBackListHolder.add("new_introducer_form");
firstPage++;
}
}
private class AddIntroducerBtnAction2 extends MouseAdapter
{
@Override
public void mouseClicked(MouseEvent e)
{
CardLayout card = (CardLayout)mainPanelHolder.getLayout();
card.show(mainPanelHolder, "new_introducer_form");
goBackListHolder.add("new_introducer_form");
firstPage++;
}
}
// The listener of the Back Button
private class GoBackBtnAction extends MouseAdapter
{
@Override
public void mouseClicked(MouseEvent e)
{
if(firstPage==0){}
else
{
CardLayout card = (CardLayout)mainPanelHolder.getLayout();
firstPage--;
card.show(mainPanelHolder, goBackListHolder.get(firstPage));
}
}
}
private List goBackListHolder=new ArrayList();
private int firstPage=0;
//听众
私有类AddNewClientsBtnAction扩展了MouseAdapter
{
@凌驾
公共无效mouseClicked(MouseEvent e)
{
CardLayout卡=(CardLayout)mainPanelHolder.getLayout();
卡片展示(主面板持有人,“新客户表格”);
goBackListHolder.添加(“新客户表格”);
首页++;
}
}
私有类AddProviderBtnAction扩展了MouseApter
{
@凌驾
公共无效mouseClicked(MouseEvent e)
{
CardLayout卡=(CardLayout)mainPanelHolder.getLayout();
卡片展示(主面板持有人,“新供应商表格”);
goBackListHolder.add(“新供应商表格”);
首页++;
}
}
私有类AddInProducerbtNaction扩展了MouseApter
{
@凌驾
公共无效mouseClicked(MouseEvent e)
{
CardLayout卡=(CardLayout)mainPanelHolder.getLayout();
卡片展示(主面板持有人,“新介绍人表格”);
goBackListHolder.添加(“新介绍人表格”);
首页++;
}
}
私有类AddInProducerBTNAction2扩展了MouseApter
{
@凌驾
公共无效mouseClicked(MouseEvent e)
{
CardLayout卡=(CardLayout)mainPanelHolder.getLayout();
卡片展示(主面板持有人,“新介绍人表格”);
goBackListHolder.添加(“新介绍人表格”);
首页++;
}
}
//后退按钮的侦听器
私有类GoBackBtnAction扩展了MouseAdapter
{
@凌驾
公共无效mouseClicked(MouseEvent e)
{
如果(第一页==0){}
其他的
{
CardLayout卡=(CardLayout)mainPanelHolder.getLayout();
第一页--;
card.show(mainPanelHolder、goBackListHolder.get(首页));
}
}
}
这是可行的,但有时它会断裂,移动到错误的位置。上面的代码并不完整,因为有大量的侦听器
那么,关于如何解决这个问题,有什么想法吗
但过了一段时间,它会断裂,移动到错误的地方
很难调试随机问题,因此解决方案是消除潜在的错误
上面的代码并不完整,因为有大量的侦听器
可能您的某个侦听器中的代码不正确。也就是说,你可能有一个卡名的拼写错误,这是造成问题的原因
根据张贴的代码,您总是使用show(xxx)
方法移动到另一张卡
因此,我将扩展CardLayout
并添加自定义代码,而不是将自定义代码添加到ActionListeners。也就是说,我将覆盖show(…)
方法来跟踪您要显示的卡。因此,每次调用show(…)
方法时,您都会将卡名添加到ArrayList中
您还需要将undoCard(…)
方法添加到扩展卡布局中,以移回上一张卡。把所有的逻辑放在一个地方
并在单击按钮时向后移动列表
我不知道你的要求是只回去,还是你还需要继续前进的能力
如果只需要返回,则不需要“firstPage”变量。要转到上一张卡,您只需从ArrayList中删除最后一个条目,然后转到现在是ArrayList中最后一个条目的卡
无论如何,这个建议的要点是,通过将代码移动到定制的CardLayout,您可以最大限度地减少应用程序中的编码需求,这也可以最大限度地减少出错的可能性
但过了一段时间,它会断裂,移动到错误的地方
很难调试随机问题,因此解决方案是消除潜在的错误
上面的代码并不完整,因为有大量的侦听器
可能您的某个侦听器中的代码不正确。也就是说,你可能有一个卡名的拼写错误,这是造成问题的原因
根据张贴的代码,您总是使用show(xxx)
方法移动到另一张卡
因此,我将扩展CardLayout
并添加自定义代码,而不是将自定义代码添加到ActionListeners。也就是说,我将覆盖show(…)
方法来跟踪您要显示的卡。因此,每次调用show(…)
方法时,您都会将卡名添加到ArrayList中
您还需要将undoCard(…)
方法添加到扩展卡布局中,以移回上一张卡。把所有的逻辑放在一个地方
并在单击按钮时向后移动列表
我不知道你的要求是只回去,还是你还需要继续前进的能力
如果只需要返回,则不需要“firstPage”变量。要转到上一张卡,您只需从ArrayList中删除最后一个条目,然后转到现在是ArrayList中最后一个条目的卡
无论如何,这个建议的要点是,通过将代码移动到定制的CardLayout,可以最大限度地减少在应用程序中编码的需要
+---------------+
|new_client_form|
+---------------+
firstPage == 1 <- this is already wrong. List is indexed at 0.
+---------------+ +-----------------+
|new_client_form|-->|new_provider_form|
+---------------+ +-----------------+
firstPage == 2
+---------------+ +-----------------+
|new_client_form|-->|new_provider_form|
+---------------+ +-----------------+
firstPage == 1
+---------------+ +-----------------+ +-------------------+
|new_client_form|-->|new_provider_form|-->|new_introducer_form|
+---------------+ +-----------------+ +-------------------+
firstPage == 2
//Empty stack
+-----------------+
| new_client_form |
+-----------------+
+-------------------+
| new_provider_form |
+-------------------+
| new_client_form |
+-------------------+
+---------------------+
| new_introducer_form |
+---------------------+
| new_provider_form |
+---------------------+
| new_client_form |
+---------------------+
+-------------------+
| new_provider_form |
+-------------------+
| new_client_form |
+-------------------+
//Here you get the new_introducer_form passed back
+-----------------+
| new_client_form |
+-----------------+
// Here you get the new_provider_form passed back.
//Empty stack.
//Here you get the new_client_form passed back.