簡體   English   中英

導航到CardLayout中以前可見的卡

[英]Navigating to the previously visible card in a CardLayout

我有一個帶有CardLayout的表單。 在這種布局中,我有很多紙牌。 一切正常,直到我不得不使用按鈕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));

                }
            }
        }

可以,但是有時會中斷,然后移至錯誤的位置。 上面的代碼不是完整的代碼,因為有大量的偵聽器。

那么,關於如何解決此問題的任何想法?

但過了一段時間,它會移到錯誤的地方

難以調試隨機問題,因此解決方案是消除潛在的錯誤。

上面的代碼不是完整的代碼,因為有大量的偵聽器。

也許您在其中一個偵聽器中有錯誤的代碼。 可能是您輸入的卡名稱有錯字,導致了問題。

根據發布的代碼,您始終可以使用show(xxx)方法移至其他卡。

因此,我將擴展CardLayout並添加您的自定義代碼,而不是將您的自定義代碼添加到ActionListeners中。 那就是我會重寫show(...)方法來跟蹤要顯示的卡。 因此,每次調用show(...)方法時,都將卡名稱添加到ArrayList中。

您還希望向擴展的CardLayout中添加一個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

您可以看到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.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM