我从这篇文章中了解到,不要在 JComponent 上设置大小,您不会在任何组件上设置首选大小,而是让布局管理器为您执行此操作。
我的问题是,我有一个 JPanel,我将它放入 JTabbedPane 中,放入这样的 JFrame
JFrame frame=new JFrame();
JTabbedPane pane=new JTabbedPane();
pane.addTab("Tab 1",new JScrollPane(getJPanel1()));
pane.addTab("Tab 2",new JScrollPane(getJPanel2()));
frame.setContentPane(pane);
现在在这种情况下,JTabbedPane 将采用您添加到其中的最大组件的大小。因此,我的 JScrollPane 根本没有出现。我需要设置 JScrollPane 的首选大小,如果我不设置它,滚动条将不会出现并且内容会被剪切。
我如何使用布局管理器来解决这个问题。我想专门这样做:
使 JFrame/JTabbedPane/JPanelInTab 延伸到屏幕的高度(进入窗口的任务栏),如果选项卡内容要被剪切,则应该出现滚动条。框架的宽度应与 JTabbedPane 完全一样。
编辑
这是一个 MVCE,它显示了我正在尝试做的事情。我已经根据 peeskillet 的建议包含了更改,但没有效果
import javax.swing.*;
import java.awt.*;
public class ScrollPaneTest {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame=new JFrame();
frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
JTabbedPane tabbedPane=new JTabbedPane();
tabbedPane.addTab("Tab 1", wrapWithBorderLayoutPanel(getPanel()));
tabbedPane.addTab("Tab 2", wrapWithBorderLayoutPanel(getPanel()));
//
// tabbedPane.addTab("Tab 1", new JScrollPane(getPanel()));
// tabbedPane.addTab("Tab 2", new JScrollPane(getPanel()));
frame.setContentPane(tabbedPane);
frame.pack();
frame.setVisible(true);
}
private JPanel wrapWithBorderLayoutPanel(JPanel panel) {
JPanel borderLayoutPanel=new JPanel(new BorderLayout());
borderLayoutPanel.add(new JScrollPane(panel), BorderLayout.CENTER);
return borderLayoutPanel;
}
private JPanel getPanel() {
JPanel panel=new JPanel();
Box box = Box.createVerticalBox();
for (int i = 1; i <= 100; i++) {
box.add(new JLabel("This is Label #" + i));
}
panel.add(box);
return panel;
}
});
}
}
一旦我这样做,下面就是我得到的输出。框架不会在任务栏结束。它在它后面延伸。所以最后一个标签隐藏在任务栏后面。我希望框架在任务栏开始之前结束。
PS:如果我用 BorderLayout 面板包裹面板或将滚动窗格直接添加到选项卡式窗格中,则没有任何变化。两者的结果都是一样的。您可以通过注释行来测试相同
//tabbedPane.addTab("Tab 1", wrapWithBorderLayoutPanel(getPanel()));
//tabbedPane.addTab("Tab 2", wrapWithBorderLayoutPanel(getPanel()));
tabbedPane.addTab("Tab 1", new JScrollPane(getPanel()));
tabbedPane.addTab("Tab 2", new JScrollPane(getPanel()));