JScrollPane doesn't work for my JPanel

不打扰是莪最后的温柔 提交于 2019-12-05 15:15:27
Andrew Thompson
  1. Don't set a preferred size on the panel. See Should I avoid the use of setPreferred/Maximum/MinimumSize methods in Java Swing? for the reasons why.
  2. Add only the scroll pane to the content pane.
    1. A content pane using the default layout (BorderLayout) will default to putting the component in the CENTER constraint if none is supplied, and the CENTER area can only accept a single component.
    2. Besides that, the panel has already been added to the scroll pane, it will already appear inside it, and can only appear in a single container.
  3. Don't extend frame, just use an instance of one.
  4. Don't setSize, but setExtendedState.
  5. GUIs should be constructed and updated on the EDT.
  6. A better close operation is DISPOSE_ON_CLOSE.

import java.awt.*;
import javax.swing.*;

public class Question {

    public Question() {
        JFrame f = new JFrame();
        f.setLayout(new BorderLayout());
        f.setResizable(false);
        f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        JPanel panel = new JPanel();
        panel.setBorder(BorderFactory.createLineBorder(Color.red));
        panel.setLayout(new BoxLayout(panel, 1));
        for (int i = 0; i < 100; i++) {
            panel.add(new JButton("kjdh"));
        }
        JScrollPane scrollPane = new JScrollPane(panel);
        f.getContentPane().add(scrollPane);
        f.pack();
        f.setExtendedState(JFrame.MAXIMIZED_BOTH);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                new Question();
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

You've added an unecessary duplicate panel on the context pane. Instead of:

getContentPane().add(scrollPane);
getContentPane().add(panel);

use only

getContentPane().add(scrollPane);

It makes sense as a scrool pane is a container for a panel, so it's enough to add a container on the context pane.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!