导航到CardLayout中之前可见的卡片

时间:2014-08-21 15:06:47

标签: java swing user-interface arraylist cardlayout

我有一张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));

                }
            }
        }

这样可行,但在一段时间后它会中断,移动到不正确的地方。上面的代码并不完整,因为有大量的听众。

那么,关于如何解决这个问题的任何想法?

2 个答案:

答案 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.