Größe eines JScrollPane in einem JTabbedPane in einem JFrame

Ich verstehe aus diesem BeitragLegen Sie keine Größen für eine JComponent fest dass Sie keine bevorzugten Größen für eine Komponente festlegen und stattdessen den Layout-Manager dies für Sie tun lassen.

Meine Frage ist, ich habe ein JPanel, das ich in ein JTabbedPane in ein JFrame wie dieses eingefügt habe

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

In diesem Fall nimmt das JTabbedPane die Größe der Komponente mit der maximalen Größe an, die Sie hinzufügen. Aus diesem Grund wird mein JScrollPane überhaupt nicht angezeigt. Ich muss die bevorzugte Größe des JScrollPane festlegen. Wenn ich sie nicht festlege, werden die Bildlaufleisten nicht angezeigt und der Inhalt wird abgeschnitten.

Wie verwende ich einen Layout-Manager, um dieses Problem zu lösen? Ich möchte dies speziell tun:

Stellen Sie sicher, dass sich JFrame / JTabbedPane / JPanelInTab bis zur Höhe des Bildschirms erstreckt (in der Taskleiste von Fenstern). Wenn der Inhalt der Registerkarte abgeschnitten wird, sollten die Bildlaufleisten angezeigt werden. Die Breite des Rahmens sollte genau so groß sein wie das JTabbedPane.

BEARBEITEN

Hier ist eine MVCE, die zeigt, was ich versuche zu tun. Ich habe die Änderungen gemäß dem Vorschlag von peeskillet aufgenommen, aber es gibt keine Wirkung

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

}

Sobald ich das tue, ist der folgende Ausgang, den ich erhalte. Der Rahmen endet nicht in der Taskleiste. Es erstreckt sich dahinter. Das letzte Label ist also hinter der Taskleiste versteckt. Ich möchte, dass der Frame endet, bevor die Taskleiste beginnt.

PS: Es ändert sich nichts, wenn ich das Bedienfeld in ein BorderLayout-Bedienfeld einbinde oder das Bildlauffenster direkt zum Registerkartenfenster hinzufüge. Beides ergibt dasselbe. Sie können dies auch testen, indem Sie Zeilen auskommentieren

           //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()));

Antworten auf die Frage(2)

Ihre Antwort auf die Frage