2009-07-11 7 views
2

私はユーザーに表示したい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を削除すると、すべて正常に機能します。 2つのタブ。私はここに投稿する問題を単純化しようとしたが、これを思いついた。

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つのタブが表示されますが、3つ目のタブの分割ウィンドウにはボタンは表示されません。

私の質問は何ですか?JSplitPanelで何が問題になっていますか?既に他のタブに表示されているオブジェクトを表示させることはできませんか?意味がない。私を助けてください。

(注:私は私が彼らには同一の参照になりたいように表示しようとしていますコンポーネントを複製する必要はありません)

答えて

1

私にも同じ問題がありました。この問題について私が解決したことは、各GUIをMVCパターン(Model-view-controller)として作成し、コントローラがguiコンポーネントで反復する方法を知っていることです。

各タブで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のリスナーを登録するので、コントローラに通知し、リスナーの行動を取るであろう。 「First」タブのGUIView1が変更されても、「Both」タブのGUIView1も、「First」タブのGUIView1の同じ動作として更新されます。

欠点は、タブとJSplitPaneでGUIViewの新しいインスタンスを作成する必要がありました。ただし、コントローラはすべてのGUIイベントと動作を制御して共有できます。

私はそれが役に立ちそうです。

Tiger。

+0

はい、私はタブに「addChangeListener」を追加でき、GUIViewのインスタンスを1つしか作成できず、その変更リストに基づいてguiコンポーネントを前後に切り替えることができます。 – Tiger

+0

答えをありがとう。それは正しい(あなた自身でこの問題を解決して以来)そうだが、実際には私のプログラムのための別のGUIデザインが見つかったので、これを実装する必要はないだろう。 –

6

SwingのUIは階層的であり、あなただけの階層にコンポーネントを追加することができます一度。複数のコンテナにコンポーネントを追加すると、予期しない結果が発生します。コンポーネントを複製したくないのは間違いありませんが、JTabbedPaneのリスナーを使用して、タブまたはJSplitViewから各コンポーネントを追加または削除する必要があります。

tabs.addChangeListener(new ChangeListener() { 
    public void stateChanged(ChangeEvent e) { 
     // Reorganise the display based on the current tab selection. 
    } 
} 
関連する問題