我有一个swing组件,其中组件的理想大小将根据当前显示的内容而变化(在本例中为图像)。
我希望在内容更改时更改此首选大小,并允许更改布局(例如,如果在JScrollPane中使用组件,则滚动范围将更改以适应组件的大小)。
在Swing中实现这一点的规范方法是什么?
建议:
- 使用一个类扩展JPanel(或JComponent)
- 给它一个
getPreferredSize()
方法重写,在该方法中返回一个具有所需参数的Dimension - 例如,如果直径将基于BufferedImage,则可以有以下内容:
getPreferredSize示例:
public Dimension getPreferredSize() {
if (myBuffImg != null) {
return new Dimension(myBuffImg.getWidth(), myBuffImg.getHeight());
}
// default return value
return super.getPreferredSize();
}
编辑
关于您的评论:
您将如何处理组件内容图像发生更改的情况?这只是触发在周围容器中重新布局的一种情况吗?
当然,你应该给这个类一个setImage(Image image)
方法,你可以从这个方法中repaint()
这个面板。我认为方法可以在这个JPanel的祖先上调用revalidate()
,从而导致这个组件被重新部署,但我并不太喜欢这个类中的方法对其祖先有副作用,我认为调用setImage(...)
方法的代码建议容器重新验证自己可能会更好。
很多都将取决于您的个人需求。当处理"图像窗格"时,当图像发生变化时,我通常会调用setPreferredSize
和invalidate
、repaint
。
更改布局应该会自动触发无效的重新打印请求。
但我同意Hovercraft的观点,你会想从你自己的海关小组来做这件事。
另一种方法是使用类似CardLayout
的东西来处理不同内容布局之间的变化,而不是清理单个面板并向其重新添加组件
我还想看看可滚动