我无法做到这一点。我有一个滑块来增加我的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高,我在开始时设置它。
答案 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