4

我遇到了嵌套 JScrollPanes 的问题。基本上我想要一个垂直滚动但不水平滚动的外部 JScrollPane(想想 Netflix Web 界面)。在这个外部 JScrollPane 内部,我想要多个水平滚动的 JScrollPane。我的问题是内部 JScrollPanes 的水平滚动条永远不会出现,因为它们看起来占据了 JPanel 的整个首选大小。这是一张图片来描述我在说什么:

在此处输入图像描述

编辑:此代码基于 camickr 的答案现在正在工作:

import java.awt.BorderLayout;

import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class NestedScrollPane extends JFrame {

    public NestedScrollPane() {
        ScrollablePanel outerPanel = new ScrollablePanel();
        outerPanel.setScrollableWidth(ScrollablePanel.ScrollableSizeHint.FIT);
        outerPanel.setLayout(new BoxLayout(outerPanel, BoxLayout.Y_AXIS));
        for (int j = 0; j < 20; j++) {
            ScrollablePanel innerPanel = new ScrollablePanel();
            innerPanel.setScrollableHeight(ScrollablePanel.ScrollableSizeHint.NONE);
            innerPanel.setLayout(new BoxLayout(innerPanel, BoxLayout.X_AXIS));
            JScrollPane innerScrollPane = new JScrollPane(innerPanel);
            innerScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
            for (int i = 0; i < 10; i++) {
                JLabel longLabel = new JLabel("asefaesfesfesfgesgersgrsgdrsgdrsgderg ");
                innerPanel.add(longLabel);
            }
            outerPanel.add(innerScrollPane);
        }
        JScrollPane outerPane = new JScrollPane(outerPanel);
        outerPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        this.setContentPane(outerPane);
        this.setSize(400, 400);
        outerPane.setSize(400, 400);
        this.setVisible(true);
    }

    public static void main (String[] args) {
        NestedScrollPane pane = new NestedScrollPane();
        pane.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

我看了一下如何在 JScrollPane 中获取 JScrollPanes 以跟随父级的大小调整,但在外部面板上使用 BoxLayout 或 BorderLayout 似乎没有解决任何问题。

4

1 回答 1

6

您需要实现Scrollable添加到视口的外部面板的接口,以强制面板填充视口的宽度。

一个简单的方法是使用Scrollable Panel。您应该能够使用:

// JPanel outerPanel = new JPanel();
ScrollablePanel outerPanel = new ScrollablePanel();
outerPanel.setScrollableWidth( ScrollablePanel.ScrollableSizeHint.FIT );
于 2013-07-12T15:24:38.400 回答