2009-07-11 54 views
2

我有兩個面板希望顯示給用戶。我決定將它們添加到JTabbedPane。我也希望允許用戶同時並排查看它們。因此,我增加了兩個小組到我的JTabbedPane的,然後我創建了一個JSplitPanel這樣:JSplitPanel(或JTabbedPane)有什麼問題?

tabs.addTab("Align Image Points", imageControlPanel); 
    tabs.addTab("Align Map Points", mapControlPanel); 
    JSplitPane splitPane = new JSplitPane(
      JSplitPane.HORIZONTAL_SPLIT, true, imageControlPanel, 
      mapControlPanel); 
    tabs.addTab("Side by side view", splitPane); 

產生的JTabbedPane中只有一個選項卡!當我刪除JSplitPane時,一切正常。兩個選項卡。然後,我試圖簡化問題發佈在這裏,我想出了這個:

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JSplitPane; 
import javax.swing.JTabbedPane; 

public class Test { 

    public static void main(String[] args) { 
     JFrame f = new JFrame("Test"); 
     JButton b1 = new JButton("First"); 
     JButton b2 = new JButton("Second"); 
     JSplitPane s = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,true,b1,b2); 
     JTabbedPane tabs = new JTabbedPane(); 
     tabs.addTab("First", b1); 
     tabs.addTab("Second", b2); 
     tabs.addTab("Both", s); 
     f.getContentPane().add(tabs); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.pack(); 
     f.setVisible(true); 
    } 

} 

這給了我另一個問題!它顯示3個選項卡,但第三個選項卡的分割窗格不顯示任何按鈕!

所以我的問題是什麼JSplitPanel有問題?你不能讓它顯示已經顯示在另一個選項卡中的對象?這個不成立。請幫幫我。

(注:我不想重複,我現在正要顯示組件,我想他們是相同的)

回答

1

我遇到了同樣的問題。我爲這個問題解決了什麼問題,我將每個GUI作爲MVC模式(模型 - 視圖 - 控制器),控制器知道如何使用GUI組件進行迭代。

我在每個Tab上創建了GUI(View)的新實例;但是,由於控制器知道如何處理GUI流和行爲,因此我爲該GUI注入了與該構造函數參數相同的控制器實例。

例如,

GUIView1Controller controller1 = new GUIView1Controller(); 
    GUIView2Controller controller2 = new GUIView2Controller(); 

    // Add new instance GUI ; however , use the same instance of controller 
    JSplitPane s = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,true, 
         new GUIView1(controller1), new GUIView2(controller2)); 

    JTabbedPane tabs = new JTabbedPane(); 
    tabs.addTab("First", new GUIView1(controller1)); 
    tabs.addTab("Second", new GUIView2(controller2)); 
    tabs.addTab("Both", s); 

GUIView1和GUIView2將所有的GUI聽衆註冊到控制器,所以控制器將被通知,並採取對於聽衆的動作。無論第一個選項卡上的GUIView1是否更改,「Both」選項卡上的GUIView1也會更新爲與「第一個」選項卡上的GUIView1相同的行爲。

缺點是你必須在選項卡和JSplitPane上創建一個GUIView的新實例;然而,控制器可以控制和共享所有的gui事件和行爲。

我希望它有幫助。

老虎。

+0

是的,我喜歡banjollity的想法,您可以在選項卡上添加「addChangeListener」,您只能創建一個GUIView實例,並基於該更改列表器,可以來回切換gui組件。 – Tiger 2009-07-11 15:07:38

6

搖擺的用戶界面是分層的,你只能將組件添加到層次結構一旦。如果您將組件添加到多個容器,則會得到不可預知的結果。您不希望複製組件是正確的,但是您需要JTabbedPane上的偵聽器,以便在選項卡更改時從選項卡或JSplitView中添加和刪除每個組件。

tabs.addChangeListener(new ChangeListener() { 
    public void stateChanged(ChangeEvent e) { 
     // Reorganise the display based on the current tab selection. 
    } 
}