2

我只是无法做到这一点。我有一个滑块来增加我的 JPanel 的大小(用作画布来绘制)。

每当 JPanel 接收到事件时,我使用 setBounds() 调整它的大小,我可以看到它在瞬间调整大小,但是下一个 Paint 或其他东西将它切换回滑块的首选大小属性给出的原始大小。

public class ShapesMainFrame extends JFrame {
    private PaintCanvas paintCanvas;
    public ShapesMainFrame() {
        [...]
        JScrollPane scrollPane = new JScrollPane(paintCanvas);
        scrollPane.setPreferredSize(new Dimension(1,600));
        add(scrollPane, BorderLayout.CENTER);
        pack();
    }
}

public class PaintCanvas extends JPanel {
    [...]
    public void setScale(int value) {
        setSize(1000,1000);
    }
}

因此,当我尝试将 JPanel 的大小更改为较大的值时,它应该调整大小并且滚动条应该出现正确吗?好吧,它保持和我一开始设置的一样高 600 像素。

4

2 回答 2

9

使用布局管理器时切勿使用 setSize() 或 setBounds。它的“首选尺寸”很重要。通常,组件的首选大小由布局管理器自动确定。但如果您在面板上进行自定义绘画,您可能需要手动确定首选尺寸。

当面板的首选大小大于滚动窗格的大小时,将出现滚动条。覆盖 getPreferredSize() 方法(首选解决方案)或使用自定义面板的 setPreferredSize() 方法。

于 2010-11-17T01:37:15.047 回答
5

您需要做的就是在 JScollPane 中的内容更新大小后调用 revalidate()。此外,在使用布局管理器时使用 setPreferredSize()。

public void setScale(int value) {
     setPreferredSize(new Dimension(1000, 1000);   
     revalidate();
}

这将强制 JScrollPane 更新它的滚动条。

另外,你可以打电话

paintCanvas.revalidate()

如果您想从您的paintCanvas 类之外更新 JScrollPane

于 2010-12-31T20:19:31.797 回答