2009-05-18 81 views
4

有一种方法(例如,通过一个事件?),以确定何时Swing组件变为“可显示的” - 按的Javadoc Component.getGraphics什么时候Swing组件'可显示'?

我想这样做的原因是,这样我就可以调用getGraphics(),并传递给该组件我的“渲染策略”。

我试过增加一个ComponentListener,但是componentShown似乎没有被调用。还有什么我可以尝试?

谢谢。

,另外,是不是OK保持Graphics对象我收到的持有?或者是否有可能在Component的生命周期后期创建新的? (例如,它的大小后/隐藏?)

+0

不保存图形对象。它可能会因许多原因而改变。 – KitsuneYMG 2009-05-19 14:26:05

回答

3

添加的HierarchyListener

public class MyShowingListener { 
private JComponent component; 
public MyShowingListener(JComponent jc) { component=jc; } 

public void hierarchyChanged(HierarchyEvent e) { 
    if((e.getChangeFlags() & HierarchyEvent.SHOWING_CHANGED)>0 && component.isShowing()) { 
     System.out.println("Showing"); 
    } 
} 
} 

JTable t = new JTable(...); 
t.addHierarchyListener(new MyShowingListener(t)); 
+1

对于我的问题,这绝对是最好的答案,但我想我会选择wilums2的调整大小的建议,因为无论如何,这是我将要听的一个事件。谢谢。类需要: – 2009-05-18 20:29:11

1

您可以侦听resize事件。首次显示组件时,它将从0,0调整到布局管理器确定的任何内容(如果有)。

0

我一直使用Coomponent.addNotify知道什么时候该组件已准备好rendered.Not知道,如果是最好的方式,但它为我工作。当然,您必须对组件进行子类化。

Component.isDisplayable应该是正确的答案,但我知道它不适合我,因为我认为它会(我不记得为什么,但有一些东西,我切换到addNotify)。

在SUN的源代码来看,我可以看到火灾的addNotify一个HierarchyEvent.SHOWING_CHANGED所以这是通知的最佳途径。