我有一张CardLayout
的表单。在这个布局中,我有很多卡片。一切都很顺利,直到我不得不创造一种方式来转移到之前的xcarsd"通过使用按钮xclixck。 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));
}
}
}
这样可行,但在一段时间后它会中断,移动到不正确的地方。上面的代码并不完整,因为有大量的听众。
那么,关于如何解决这个问题的任何想法?
答案 0 :(得分:2)
但过了一段时间它会中断,移动到错误的地方
难以调试随机问题,因此解决方案是消除潜在的错误。
上面的代码并不完整,因为有大量的听众。
也许你的一个侦听器中的代码不正确。也许你有一个输入错误的卡片名称会导致问题。
根据发布的代码,您始终使用show(xxx)
方法转移到其他卡片。
因此,我不会将自定义代码添加到ActionListeners,而是扩展CardLayout
并添加自定义代码。那就是我会覆盖show(...)
方法来跟踪你想要显示的卡片。因此,每次调用show(...)
方法时,都会将卡名称添加到ArrayList。
您还需要在扩展的CardLayout中添加undoCard(...)
方法,以便返回上一张卡片。将所有逻辑保存在一个地方。
并在单击按钮时移回列表
我无法判断你的要求是否只是要回去,还是你还需要能够继续前进?
如果你只需要回去,那么你就不需要&#34; firstPage&#34;变量。要转到上一张卡,您只需从ArrayList中删除最后一个条目,然后转到现在是ArrayList中最后一个条目的卡片。
无论如何,这个建议的要点是,通过将代码移动到自定义的CardLayout,您可以最大限度地减少在应用程序中编码的需要,这也可以最大限度地减少错误的可能性。
答案 1 :(得分:2)
当您返回卡片时,您还必须从列表末尾删除您刚才使用的卡片。
假设你去了一个新的客户表单:
+---------------+
|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
您可以看到firstPage
现在已经过时了。
我建议使用Stack
而不是列表。然后,当你前进时可以push()
,当你回去时可以pop()
。 pop()
将从堆栈中取出顶部元素并将其提供给您,这样您就不必跟踪索引。但是,确保在离开该页面之前不要将卡片推入堆栈,然后向前。否则,如果你在到达时推了一张卡,当你试图返回时,你会得到同一张卡,而你将被卡在原地。
以下是Stack
的另一个例子:
转到新客户表单:
//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.