JScrollPane 防止组件缩小到其首选大小以下

JScrollPane prevents components shrinking below their preferred size

我正在使用 Miglayout 为我的程序定义布局。问题是 JScrollPane 阻止 JButton 缩小到其首选大小以下。 JButton 的最小、首选和最大宽度设置如下,"w 300:600:900" //min:pref:max

解决此问题的最佳方法是什么?

SSSCE

import java.awt.*;
import javax.swing.*;
import net.miginfocom.swing.MigLayout;

public class ButLay extends JFrame {

    private ButLay()  {
        super("Button Layout");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new MigLayout("", "grow", "grow"));
        createPanel();
        setSize(800, 200);
        setVisible(true);
    }

    JPanel panel = new JPanel(new MigLayout("", "grow", "grow"));
    JScrollPane scroll;
    JButton button = new JButton("Button");

    private void createPanel() {
        panel.add(button, "gapleft 100, align right, w 300:600:900, south");
        scroll = new JScrollPane(panel);
        getContentPane().add(scroll, "grow");
    }

    public static void main(String[] args) {
        new ButLay();
    }
}

JScrollPane 的默认行为是以其首选大小在滚动窗格中显示组件,以便滚动条可以根据需要显示。

如果你想改变行为,那么你可以尝试在你的面板上实现 Scrollable 接口。您可以将 getScrollableTracksViewportWidth() 方法覆盖为 return true。现在您的面板应该随着滚动窗格的视口调整大小而调整大小。但是,如果视口太小,使用这种方法将无法获得滚动条。

如果你想要上述情况下的滚动条,那么你可能还需要重写getPreferredSize()方法来return当preferredSize大于视口尺寸时的最小尺寸。

您还可以查看 Scrollable Panel,它为您实现了 Scrollable 接口,并允许您使用一些方便的方法自定义行为。