简体   繁体   中英

JPanel not scrolling in JScrollPane

I have a JPanel that I create like so

    JPanel statsKeysPanel = new JPanel(new MigLayout("insets 0", "[]", ""));

and populate with a dynamic number of JLabels stacked on top of each other. For the sake of an example:

    for(int i = 0; i < 30; i++) {
        statsKeysPanel.add(new JLabel("" + i + " key value"), "wrap");
    }

I then create and add the scroller like so

    JPanel panel = new JPanel(new MigLayout("insets 0", "[center][][center][]", "[][]"));
    final JScrollPane keysScroller = new JScrollPane(this.statsKeysPanel, ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER,
        ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
    keysScroller.setMaximumSize(new Dimension(100, 300));
    panel.add(keysScroller, "cell 0 1");

The max of 300 is applied but the 15 out of 30 JLabels that don't fit in 300px are hidden, and scrolling doesn't work. What am I doing wrong? (image below)

在此处输入图片说明

final JScrollPane keysScroller = new JScrollPane(this.statsKeysPanel, ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER,
        ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

Why are you using NEVER for both the horizontal and vertical scrollbar? I would think this would prevent a scrollbar from appearing.

I generally don't set either property and just let the scrollpane determine when to display the scrollbar. Sometimes I use ALWAYS to reserve space for the scrollbar.

You are using unnecessarily two panels; one will suffice. I think that you have omitted the code that caused your error.

Here is a working example:

package com.zetcode;

import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import net.miginfocom.swing.MigLayout;

public class StatsKeyEx extends JFrame {

    public StatsKeyEx() {

        initUI();
    }

    private void initUI() {

        JPanel pnl = new JPanel(new MigLayout());

        for (int i = 0; i < 60; i++) {
            pnl.add(new JLabel("" + i + " key value"), "wrap");
        }

        JScrollPane spane = new JScrollPane(pnl);
        spane.setPreferredSize(new Dimension(150, 200));
        add(spane);

        pack();

        setTitle("Scrolling");
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                StatsKeyEx ex = new StatsKeyEx();
                ex.setVisible(true);
            }
        });
    }
}

The scrollbars are shown as needed.

在此处输入图片说明

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM