嵌套的JTabbedPane内容未按预期呈现

时间:2017-03-31 01:18:38

标签: java swing jtabbedpane

我正在构建一个Java Swing应用程序,并尝试在其中使用嵌套的JTabbedPane组件,并且结果好坏参与。

在我的顶级JFrame中,我能够使用JPanel成功构建和加载选项卡式窗格。在应用程序的顶层,有两个部分,每个部分分配给一个选项卡:General和Stream,两者都基于JPanels。 Stream拥有自己的JTabbedPane,因为它由三个从属部分组成:元数据,输入和实例,所有这些都基于JPanels。在JFrame组件中编写的所有代码都按预期工作。选项卡已初始化,JFrames已分配给选项卡,并且它们都可以正确显示到某个点。以下是我的JFrame组件中的代码:

flatten = (array) ->
  flat = []
  for element in array
    if Array.isArray(element)
      flat = flat.concat flatten element
    else
      flat.push element
  flat

请注意,我将Input JPanel添加到选项卡,其选项卡显示出来。我在我的输入JPanel中放了一个JLabel来测试它,它是可见的。但是,我的输入JPanel也加载了一组选项卡,当我运行应用程序时,这些选项卡不可见。这是输入JPanel:

package gui;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Toolkit;

import javax.swing.JFrame;
import javax.swing.JTabbedPane;

public class AppFrame extends JFrame {

    private static final long serialVersionUID = 5294140238998011273L;
    private GeneralPanel generalPanel;
    private JTabbedPane appTabs;
    private JTabbedPane streamTabs;
    private MetadataPanel metadataPanel;
    private InputPanel inputPanel;

    public AppFrame() {

        super("Sourcecast");


        setIconImage(Toolkit.getDefaultToolkit()
            .getImage(getClass()
            .getResource("/images/Apple-icon-64.png")));

        setLayout(new BorderLayout());

        appTabs = new JTabbedPane(JTabbedPane.TOP);

        generalPanel = new GeneralPanel();
        appTabs.add("General", generalPanel);

        streamTabs = new JTabbedPane(JTabbedPane.TOP);

        metadataPanel = new MetadataPanel();
        streamTabs.add("Metadata", metadataPanel);

        inputPanel = new InputPanel();
        streamTabs.add("Input", inputPanel);

        appTabs.add(streamTabs, "Stream");

        add(appTabs);

        setMinimumSize(new Dimension(500, 400));
        setSize(600, 500);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }
}

以下是我尝试在“输入”面板中加载的JPanel之一,为了简单起见,我删除了Input中的其他选项卡:

package gui;

import javax.swing.JPanel;
import javax.swing.JTabbedPane;

public class InputPanel extends JPanel {

    private static final long serialVersionUID = 7603090258673682140L;
    private JTabbedPane inputTabs;
    private StdinPcmPanel stdinPcmPanel;

    public InputPanel() {

        setLayout(null);

        inputTabs = new JTabbedPane(JTabbedPane.TOP);       
        stdinPcmPanel = new StdinPcmPanel();

        inputTabs.add("StdinPCM", stdinPcmPanel);

        add(inputTabs);
    }
}

我意识到使用所有JTabbedPanes在视觉上并不令人愉悦,并且可能令人困惑。我其实打算改变它。但是,我仍然需要知道为什么这不能按预期工作。下面是两个屏幕截图,显示顶级选项卡正常工作,然后您看到单击输入时,没有任何可见。

Imported JPanel shown in nested tab

Imported JPanel with its own JTabbedPane not displayed

1 个答案:

答案 0 :(得分:1)

  

但是,我的输入JPanel还加载了一组标签,当我运行应用程序时,这些标签页不可见。

不要使用null布局。所有面板都应使用适当的布局管理器。

可能使用BorderLayout,然后添加的标签可以访问输入面板的所有可用空间。

将来(如果您需要更多帮助)发布适当的MCVE,以便在发布代码时展示问题。这是发布编译和演示问题的最小代码。

例如,我们无法访问您的面板类,因此只需使用JPanel添加到选项卡式窗格。