首页 > 解决方案 > 使用 JScrollPane 时不可靠的容器宽度

问题描述

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

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

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

标签: javaswingjframelayout-managerjscrollpane

解决方案


问题是由于preferredLayoutSize 和minimumLayoutSize 的实施不当造成的。正确使用这些方法可以修复它。


推荐阅读