【问题标题】:JPanel not scrolling in JScrollPaneJPanel 不在 JScrollPane 中滚动
【发布时间】:2014-12-06 19:16:29
【问题描述】:

我有一个这样创建的 JPanel

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

并使用堆叠在一起的动态数量的 JLabel 进行填充。举个例子:

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

然后我像这样创建并添加滚动条

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

应用了最大值 300,但不适合 300px 的 30 个 JLabel 中有 15 个被隐藏,并且滚动不起作用。我究竟做错了什么? (下图)

【问题讨论】:

  • 如果没有mcve,很难判断您做错了什么。您是否以任何方式限制 statsKeysPanel JPanel 的大小?
  • 不 - 我包含了我与 statsKeysPanel 交互的每个地方
  • 再次考虑创建并发布您的mcve。

标签: java swing jpanel jscrollpane miglayout


【解决方案1】:
final JScrollPane keysScroller = new JScrollPane(this.statsKeysPanel, ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER,
        ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

为什么水平和垂直滚动条都使用NEVER?我认为这会阻止滚动条出现。

我通常不设置任何一个属性,只是让滚动窗格确定何时显示滚动条。有时我使用ALWAYS 为滚动条预留空间。

【讨论】:

  • 我已经尝试过 ALWAYS - 出现滚动条但我仍然无法向下滚动
【解决方案2】:

您不必要地使用了两个面板;一个就足够了。我觉得 您省略了导致错误的代码。

这是一个工作示例:

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

滚动条根据需要显示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 2014-08-29
    相关资源
    最近更新 更多