更改 Swing 组件的首选大小

mik*_*era 2 java layout swing sizing layout-manager

我有一个 swing 组件,其中组件的理想大小将根据当前显示的内容(在本例中为图像)而变化。

我希望在内容更改时更改此首选大小,并且还允许更改布局(例如,如果在 JScrollPane 内使用组件,则滚动范围将更改以适应组件的大小) 。

在 Swing 中执行此操作的规范方法是什么?

Hov*_*els 5

建议:

  • 使用扩展 JPanel(或 JComponent)的类,
  • 给它一个getPreferredSize()方法重写,您可以在其中返回带有所需参数的维度。
  • 例如,如果直径基于 BufferedImage,您可能会得到类似的结果:

获取首选尺寸示例:

public Dimension getPreferredSize() {
  if (myBuffImg != null) {
    return new Dimension(myBuffImg.getWidth(), myBuffImg.getHeight());
  } 
  // default return value
  return super.getPreferredSize();      
}
Run Code Online (Sandbox Code Playgroud)

编辑
关于您的评论:

如果组件的内容图像发生变化,您将如何处理?这只是触发周围容器重新布局的情况吗?

当然,您会为此类提供一个setImage(Image image)方法,并且您可以repaint()从该方法中创建此面板。我认为该方法可以调用revalidate()此 JPanel 的祖先,从而导致该组件被重新布局,但我不太热衷于此类中的方法对其祖先产生副作用,并且认为对于调用的代码来说可能会更好setImage(...)建议容器重新验证自身的方法。