[英]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.