2

我有一个摆动组件,其中组件的理想大小将根据当前正在显示的内容(在这种情况下发生在图像)而有所不同。

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

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

4

2 回答 2

4

建议:

  • 使用类扩展 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()在这个方法中使用这个面板。我想这个方法可以调用revalidate()这个 JPanel 的祖先,导致这个组件被重新布局,但是我对这个类中的方法对其祖先有副作用并不太疯狂,并且认为代码调用可能会更好setImage(...)建议容器重新验证自身的方法。

于 2012-09-23T03:53:32.540 回答
3

很多都取决于您的个人需求。在处理“图像窗格”时,我通常会在图像更改时调用setPreferredSizeand 。invalidaterepaint

更改布局应该会自动触发无效的重新打印请求。

但我同意气垫船,你会想从你自己的海关面板中做到这一点。

另一种方法是使用类似CardLayout处理不同内容布局输出之间的变化,而不是清理单个面板并重新添加comports

我还要看看Scrollable

于 2012-09-23T03:59:04.307 回答