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

Nested JTabbedPane contents not rendering as expected

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

在我的顶级 JFrame 中,我能够使用 JPanel 成功构建和加载选项卡式窗格。在应用程序的顶层,有两个部分,每个部分都分配给一个选项卡:General 和 Stream,两者都基于 JPanels。 Stream 拥有自己的 JTabbedPane,因为它由三个从属部分组成:Metadata、Input 和 Instance,它们都基于 JPanels。 JFrame 组件中编写的所有代码都按预期工作。选项卡已初始化,JFrames 已分配给选项卡,并且所有这些都在一定程度上正确显示。到目前为止,这是我的 JFrame 组件中的代码:

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);
    }
}

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

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);
    }
}

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

package gui;

import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JComboBox;
import javax.swing.JTextField;

public class StdinPcmPanel extends JPanel {

    private static final long serialVersionUID = -916207698149110923L;
    private JComboBox<CbOption> samplerate;
    private JComboBox<CbOption> channels;
    private JComboBox<CbOption> metadata;
    private JTextField metadatafilename;

    public StdinPcmPanel() {

        setLayout(null);

        JLabel lblSampleRate = new JLabel("Sample Rate");
        lblSampleRate.setBounds(12, 12, 230, 15);
        add(lblSampleRate);

        samplerate = new JComboBox<CbOption>();
        samplerate.addItem(new CbOption(48000, "48000 Hz (DAT)"));
        samplerate.addItem(new CbOption(44100, "44100 Hz (CD)"));
        samplerate.addItem(new CbOption(22050, "22500 Hz (FM)"));
        samplerate.addItem(new CbOption(16000, "16000 Hz"));
        samplerate.addItem(new CbOption(11025, "11025 Hz"));
        samplerate.addItem(new CbOption(8000, "8000 Hz"));
        samplerate.setSelectedIndex(1);
        samplerate.setBounds(12, 39, 156, 24);
        add(samplerate);

        JLabel lblChannels = new JLabel("Channels");
        lblChannels.setBounds(12, 75, 230, 15);
        add(lblChannels);

        channels = new JComboBox<CbOption>();
        channels.addItem(new CbOption(1, "Mono"));
        channels.addItem(new CbOption(2, "Stereo"));
        channels.setSelectedIndex(1);
        channels.setBounds(12, 102, 156, 24);
        add(channels);

        JLabel lblMetadata = new JLabel("Metadata");
        lblMetadata.setBounds(12, 138, 230, 15);
        add(lblMetadata);

        metadata = new JComboBox<CbOption>();
        metadata.addItem(new CbOption(0, "None"));
        metadata.addItem(new CbOption(1, "File"));
        metadata.setSelectedIndex(0);
        metadata.setBounds(12, 165, 156, 24);
        add(metadata);

        JLabel lblMetadataFile = new JLabel("Metadata File");
        lblMetadataFile.setBounds(12, 201, 230, 15);
        add(lblMetadataFile);

        metadatafilename = new JTextField();
        metadatafilename.setBounds(12, 228, 251, 24);
        add(metadatafilename);
        metadatafilename.setColumns(10);
    }
}

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

Imported JPanel shown in nested tab

Imported JPanel with its own JTabbedPane not displayed

However, my Input JPanel is also loading a set of tabs, and those tabs are not visible when I run the app.

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

可能使用 BorderLayout,然后添加的选项卡将可以访问输入面板可用的所有 space。

将来(如果您需要更多帮助)post 一个适当的 MCVE 来演示您 post 代码时的问题。那是 post 编译和演示问题的最少代码。

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