2

我有两个希望向用户显示的面板。我决定将它们添加到 JTabbedPane。我还想让用户同时看到它们的并排视图。所以我将这两个面板添加到我的 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 只有一个选项卡!当我删除 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 有什么问题?您不能让它显示已经在另一个选项卡中显示的对象吗?这没有道理。请帮我。

(注意:我不想复制我将要显示的组件,因为我希望它们是相同的参考)

4

2 回答 2

6

Swing UI 是分层的,您只能将一个组件添加到层次结构中一次。如果您将一个组件添加到多个容器中,您将得到不可预知的结果。您不想复制组件是正确的,但是您需要在 JTabbedPane 上安装一个侦听器,以便在选项卡的选择发生变化时从选项卡或 JSplitView 添加和删除每个组件。

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 模式(模型-视图-控制器),控制器知道如何使用 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 回答