什么是Swing组件'可显示'?

时间:2009-05-18 16:54:27

标签: java swing graphics

是否有办法(例如,通过事件?)确定Swing组件何时变为“可显示” - 根据Component.getGraphics的Javadoc?

我试图这样做的原因是我可以调用getGraphics(),并将其传递给我的组件的'渲染策略'。

我尝试添加ComponentListener,但componentShown似乎没有被调用。还有什么我可以尝试的吗?

感谢。

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

4 个答案:

答案 0 :(得分: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 :(得分:1)

您可以收听调整大小事件。首次显示组件时,会将其从0,0调整为布局管理器确定的任何大小(如果有的话)。

答案 2 :(得分:0)

您需要检查组件层次结构。调用AncestorListener.ancestorAdded后检查。

答案 3 :(得分:0)

我总是使用Coomponent.addNotify知道组件何时可以渲染。不确定是否是最好的方法,但它对我有用。当然,您必须对组件进行子类化。

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

查看SUN的源代码,我可以看到addNotify触发了HierarchyEvent.SHOWING_CHANGED,因此这是获得通知的最佳方式。