0

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

在此处输入图像描述

4

2 回答 2

0

“使 JFrame/JTabbedPane/JPanelInTab 延伸到屏幕的高度(进入窗口的任务栏),如果标签内容要被剪切,滚动条应该出现。框架的宽度应该与JTabbedPane。”

对于每个JScrollPane包含每个选项卡面板的每个选项卡,您要添加到 中JTabbedPane,用 . 将它们分别包装在另一个JPanelBorderLayoutBorderLayout会导致JScrollPanes 拉长容器的大小JTabbedPane,最终拉长到 s 的大小。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();
            }
        });
    }
}

在此处输入图像描述

于 2014-01-17T09:02:26.143 回答
0

自从这个问题被投票关闭以来,我再次发布了这个问题。在那里我已经标记了正确的答案。请检查以下链接以获取答案

使用屏幕边界减去插图

于 2014-01-24T03:15:47.897 回答