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高,我在开始时设置它.
使用布局管理器时,切勿使用setSize()或setBounds.它的"首选尺寸"很重要.通常,组件的首选大小由布局管理器自动确定.但是,如果您在面板上进行自定义绘画,则可能需要手动确定首选大小.
当面板的首选大小大于滚动窗格的大小时,将显示滚动条.重写getPreferredSize()方法(首选解决方案)或使用自定义面板的setPreferredSize()方法.
您需要做的就是在更新 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