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

sek*_*t64 1 java swing jscrollpane jscrollbar

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

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

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,当我尝试将JPanel的大小更改为一个大值时,它应该调整大小并且滚动条应该显示正确吗?它保持相同的600px高,我在开始时设置它.

cam*_*ckr 7

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

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

  • 谢谢!我也尝试了setPreferredSize(),但它没有工作,所以这就是为什么我尝试了setSize.但是覆盖getPreferredSize()工作得很好!:) (2认同)

pR0*_*0Ps 5

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

public void setScale(int value) {
     setPreferredSize(new Dimension(1000, 1000);   
     revalidate();
}
Run Code Online (Sandbox Code Playgroud)

这将强制 JScrollPane 更新其滚动条。

另外,您可以致电

paintCanvas.revalidate()
Run Code Online (Sandbox Code Playgroud)

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