0

この投稿から、 JComponentにサイズを設定しないでください。コンポーネントに優先サイズを設定せず、代わりにレイアウトマネージャーにこれを行わせることを理解しています。

私の質問は、私はこのような JFrame に JTabbedPane に入れた JPanel を持っているということです

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です。peeskilet の提案に従って変更を含めましたが、効果はありません

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