2012-09-23 32 views
2

我有一个挥杆组件,其中组件的理想大小根据当前正在显示的内容(在此情况下会发生图像变化)而变化。更改Swing组件的首选大小

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

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

回答

4

建议:

  • 使用一个类继承JPanel(或JComponent中),
  • 给它一个getPreferredSize()方法重写,你返回与你想要的参数维度。
  • 例如,如果直径将基于一个BufferedImage,你可以有这样的:

的getPreferredSize例如:

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

编辑
关于你的评论:

您将如何处理组件内容图像更改的情况H?这只是触发周围容器重新布局的一种情况吗?

你会给这个类课程的setImage(Image image)方法,你可以repaint()这此方法中面板。我想这个方法可以在这个JPanel的祖先上调用revalidate(),从而导致这个组件被重新布局,但是我对这个类中对其祖先有副作用的方法并不是太疯狂,并且认为它可能对代码更好调用setImage(...)方法来建议容器重新验证自己。

+0

感谢这是有道理的 - 你将如何处理组件的内容图像更改的情况?这只是触发周围容器重新布局的一种情况吗? – mikera

+0

@mikera:请参阅编辑回答。 –

+0

非常有意义,谢谢! – mikera

3

很多都会归结为您的个人需求。在处理“图像窗格”时,我通常会在图像更改时调用setPreferredSizeinvalidate,repaint

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

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

另一种方法是使用类似CardLayout来处理不同的内容布局出局之间变化,而清理单面板,并重新加入相称它

我也想看看在Scrollable

+0

不明白.... +1 – mKorbel

+0

实际上,...不:你永远不会想要使用setXXSize - 但你最后同意@Eels ... :-) – kleopatra

+0

@mKorbel:在评论Rempelos [here](http://stackoverflow.com/a/7229662/230513),我将'setPreferredSize()'与'Scrollable'对比;都有[众所周知的警告](http://stackoverflow.com/q/7229226/230513)。 – trashgod