2012-10-18 36 views
0

我有一個使用JTabbedPane顯示其內容的開源應用程序。看看這個截圖:JTabbedPane問題:如何查找和跟蹤現有的JTabbedPane的選項卡

http://i46.tinypic.com/4rrs6c.jpg http://i46.tinypic.com/4rrs6c.jpg

主要內容有調整JSplitPane在那裏的左側是TreeMenu對象,並在右邊是JTabbedPane的對象。

當我從左側面板中點擊菜單,就會通過JTabbedPane.addTab()方法顯示JTabbedPane的菜單內容:

tabbedPane.addTab(menu.getTitle(), menu.getAPanel()); 

我需要知道如何做到這一點:當我點擊一個關聯標籤已經打開的菜單,它不會添加一個新標籤,而應該把焦點放在已經打開的標籤上。

例如,您可以在屏幕截圖中看到,我已經打開成本類型選項卡。現在,如果再次點擊費用類型菜單,它應該將焦點轉移到費用類型選項卡,而不是添加新的費用類型選項卡。

菜單本身有一個唯一的id字段(menu.getId())。但是,每次我點擊菜單時,menu.getAPanel()總是返回一個新的APanel實例。這意味着如果我點擊費用類型菜單兩次,APanel從menu.getAPanel()返回的第一次點擊,第二次點擊將永遠不會是同一個實例。

任何人都可以幫忙嗎?

UPDATE:
好吧,看來這個問題是混淆了其他人,說實話,我不是以英語爲母語,這就是爲什麼我有一個很難解釋我的問題,我已經找到了解決辦法呢(感謝MadProgrammer),所以我打算刪除這個問題,因爲我認爲它不會讓其他人受益,但爲了表彰MadProgrammer,我會將這個問題持續兩天,讓他有機會提交他的答案並得到他名不虛傳。

只有一點好奇:
這種情況下與my previous question連接。在原始源代碼中,當單擊菜單時,它實際上會顯示一個彈出窗口。我試圖改變流程:當單擊菜單時,隱藏彈出窗口,彈出窗口的內容面板(APanel)被提取並作爲選項卡的組件轉移到JTabbedPane中。

+1

*「兩個選項卡或更多可以具有相同的標題/圖標」*聽起來對用戶非常混淆。我的建議,改變或以一種合理的方式解釋這個非同尋常的陳述。 –

+2

您可以維護一個活動地圖,該地圖將每種菜單項的某種唯一鍵映射到其活動選項卡。如果該鍵不存在,則該選項卡不存在。 – MadProgrammer

+0

@Andrew:是「/」嗎?在我國,「/」可以表示「或」。無論如何,我解決它,不知道它是否仍然讓你或其他人感到困惑。 – null

回答

4

你的菜單已經有你需要的所有信息。這裏有一個快速模擬:

final JTabbedPane tabbedPane = new JTabbedPane(); 
final JComboBox items = new JComboBox(new Object[] { 
     new MyMenu("one"), new MyMenu("other"), new MyMenu("got it?") 
}); 
Action action = new AbstractAction("showInTab") { 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     MyMenu selected = (MyMenu) items.getSelectedItem(); 
     int index = tabbedPane.indexOfComponent(selected.getMenuPanel()); 
     if (index < 0) { 
      tabbedPane.addTab(selected.getName(), selected.getMenuPanel()); 
     } else { 
      tabbedPane.setSelectedIndex(index); 
     } 
    } 
}; 
items.setSelectedIndex(-1); 
items.setAction(action); 

編輯

這些語句(在這個問題):

它將利用tabbedPane.addTab顯示JTabbedPane的菜單內容(menu.getTitle (),菜單。getAPanel());

,並在註釋:

這就是爲什麼在我的非常原始的問題(以前我修改很多次),我說我不能使用indexOfComponent直接

的矛盾彼此,如下面的斷言成立:

int old = tabbedPane.getTabCount(); 
tabbedPane.addTab(somename, myTabContent) 
assertEquals(old, tabbedPane.indexOfComponent(myTabContent)); 

清理一個或另一個;-)

+0

感謝您的貢獻。其實,這是正確的,但也不完全正確,因爲問題有點複雜(如果你閱讀我的第二個問題,你可能會理解,這是我工作進程的延續^^)。這就是爲什麼在我最初的問題中(在我編輯多次之前),我說我不能直接使用indexOfComponent。總之,每次我點擊菜單時,即使菜單已經被點擊了,getMenuPanel()返回的面板總是不是同一個實例。 – null

+0

然後遍歷所有選項卡,檢查面板是否是一個孩子:它必須在某個地方,如果已經添加;-) – kleopatra

+0

更正:「這就是爲什麼在我非常原始的問題(我編輯很多次之前),我說我可以' t使用APanel作爲關鍵,因此我不能直接使用indexOfComponent查找並將焦點放在現有選項卡上「。那麼,如果你仍然有興趣解決這個問題,我可以告訴你全長代碼,或者我可以向你展示Map解決方案(對於後者,我更喜歡讓MadProgrammer先做它,因爲這個想法來自他) 。 – null

相關問題