在JFrame中调整JTabbedPane中的JScrollPane大小

我从这篇文章中了解到, 不要在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())); 

在此处输入图像描述

“使JFrame / JTabbedPane / JPanelInTab扩展到屏幕的高度(进入窗口的任务栏),如果要切割选项卡内容,则应显示滚动条。框架的宽度应与框架的宽度完全相同JTabbedPane的“。

对于每个包含每个选项卡框架的JScrollPane ,要添加到JTabbedPane ,将它们分别包装在另一个带有BorderLayout JPanelBorderLayout将导致JScrollPane扩展容器JTabbedPane的大小,最终扩展到JFrame的大小

  // set tabbed panels to BorderLayout and add scrolls panelTab1 = new JPanel(new BorderLayout()); panelTab2 = new JPanel(new BorderLayout()); panelTab1.add(panel1Scroll); panelTab2.add(panel2Scroll); // add panelTabs to tabbed pane tabbedPane = new JTabbedPane(); tabbedPane.add(panelTab1, "Panel 1"); tabbedPane.add(panelTab2, "Panel 2"); 

你可以看到我已经完成了我在上面的答案中所描述的内容。

这是正在运行的例子

 import java.awt.BorderLayout; import javax.swing.*; public class TabbedMaxSize { JTabbedPane tabbedPane; JPanel panelTab1; JPanel panelTab2; public TabbedMaxSize() { // add label to first bos Box box1 = Box.createVerticalBox(); for (int i = 1; i <= 100; i++) { box1.add(new JLabel("This is Label #" + i)); } // add labels to second box Box box2 = Box.createVerticalBox(); for (int i = 1; i <= 100; i++) { box2.add(new JLabel("This is Label #" + i)); } // add boxes to panels and to scroll panes JPanel boxPanel1 = new JPanel(); JPanel boxPanel2 = new JPanel(); boxPanel1.add(box1); boxPanel2.add(box2); JScrollPane panel1Scroll = new JScrollPane(boxPanel1); JScrollPane panel2Scroll = new JScrollPane(boxPanel2); // ser tabbed panels to BorderLayout and add scrolls panelTab1 = new JPanel(new BorderLayout()); panelTab2 = new JPanel(new BorderLayout()); panelTab1.add(panel1Scroll); panelTab2.add(panel2Scroll); // add panelTabs to tabbed pane tabbedPane = new JTabbedPane(); tabbedPane.add(panelTab1, "Panel 1"); tabbedPane.add(panelTab2, "Panel 2"); JFrame frame = new JFrame(); frame.add(tabbedPane); frame.pack(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); frame.setExtendedState(JFrame.MAXIMIZED_BOTH); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable(){ public void run() { TabbedMaxSize gui = new TabbedMaxSize(); } }); } } 

在此处输入图像描述

我再次发布了这个问题,因为这个问题被投票结束了。 在那里,我标记了正确的答案。 请查看以下链接以获取答案

使用屏幕的界限减去插入