使用 JScrollPane 时容器宽度不可靠

Unreliable Container width when using JScrollPane

我制作了一个自定义 LayoutManager 以在 space 提供的统一正方形中呈现组件,它使用以下方法实现:

    @Override
    public void layoutContainer(Container parent) {

        if(parent.getWidth() == 0) {
            return;
        }

        int columns = parent.getWidth() / gridSizeWidth;
        
        
        int x = 0, y = 0;
        for(int i = 0; i < parent.getComponentCount(); i++) {
            Component comp = parent.getComponent(i);

            comp.setBounds(x * gridSizeWidth, y * gridSizeHeight, gridSizeWidth, gridSizeHeight);
            
            if(++x == columns) {
                x = 0;
                y++;
            }

        }
        System.out.println(parent.getClass().getSimpleName() + ": " + parent.getWidth());

    }

这段代码在直接应用于 JFrame 时可以正常工作,但如果我尝试将它插入 JScrollPane 中,它很快就会崩溃。

仅添加到 JFrame 且看起来正确时,控制台显示:

TileScroller: 422

但是,将其添加到 JScrollPane 时...

TileScroller: 419
TileScroller: 26816
TileScroller: 1716224
TileScroller: 109838336
TileScroller: 419
TileScroller: 26816
TileScroller: 1716224
TileScroller: 109838336
TileScroller: 419
...

它会非常快速地重复此操作,并且会因如此快速地更改布局而导致闪烁效果。据我所知,它正确地将每个组件放置在每个尺寸的正确位置,但问题是尺寸在波动。

这是我创建 JScrollPane 的代码。

        JPanel modeIndividualTile = new JPanel();
        JScrollPane tileScroller = new JScrollPane(tileSelector = new TileScroller(creator),
                ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
                ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        tileScroller.getVerticalScrollBar().setUnitIncrement(8);

        modeIndividualTile.add(tileScroller);

        // Custom layout manager that renders everything relatively to the designated values below. (20,65) will render at x=20% of width, y=65% of height.
        rl.addComponent(frame, tileScroller, 20, 65, 80, 98);

这可能是什么原因造成的,我该如何预防?

问题是因为 preferredLayoutSize 和 minimumLayoutSize 的实施不当。正确使用这些方法修复它。