2

ユーザーに表示したい2つのパネルがあります。それらを JTabbedPane に追加することにしました。また、ユーザーが両方を同時に並べて表示できるようにしたいと考えています。そこで、2 つのパネルを JTabbedPane に追加してから、JSplitPanel を作成しました。

    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 にはタブが 1 つしかありません。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の何が問題なのですか? 別のタブに既に表示されているオブジェクトを表示することはできませんか? 意味がない。私を助けてください。

(注:表示しようとしているコンポーネントを同じ参照にしたいので、それらを複製したくありません)

4

2 に答える 2

6

Swing UIは階層的であり、階層にコンポーネントを追加できるのは1回だけです。コンポーネントを複数のコンテナに追加すると、予測できない結果が得られます。コンポーネントを複製したくないのは正しいですが、タブの選択が変更されたときにタブまたはJSplitViewに各コンポーネントを追加および削除するには、JTabbedPaneにリスナーが必要です。

tabs.addChangeListener( new ChangeListener() {
    public void stateChanged(ChangeEvent e) {
        // Reorganise the display based on the current tab selection.
    }
}
于 2009-07-11T14:29:55.340 に答える
1

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

各タブに GUI (ビュー) の新しいインスタンスを作成しましたが、コントローラーは 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 イベントと動作を制御および共有できます。

お役に立てば幸いです。

虎。

于 2009-07-11T14:48:35.167 に答える