嵌套的 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 添加到选项卡式窗格即可。
我正在构建一个 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 添加到选项卡式窗格即可。