如何在JScrollPane中修改JPanel的大小?

时间:2010-11-16 22:06:33

标签: java swing jscrollpane jscrollbar

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

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

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的大小更改为较大的值时,它应该调整大小并且滚动条应该显示为正确吗?好吧它保持相同的600px高,我在开始时设置它。

2 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:3)

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

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

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

另外,你可以打电话

paintCanvas.revalidate()

如果您想从paintCanvas类外部更新JScrollPane