如何在Java中等待组件显示?

5
我有一个组件(JPanel)在一个 Window 内。 当从父窗口获取焦点时,我总是在调用 windowGainedFocus() 事件时得到 false
我认为当调用 windowGainedFocus() 事件时,该 Window 中的 JPanel 的绘制尚未完成。
我试图将 isShowing() 调用放置在此 Windowpaint() 方法中, 但我总是得到 isShowing() = false
是否有一种方法可以在 JPanel 完全显示在屏幕上并且 isShowing() 方法将返回 true 时获得事件?
谢谢。
3个回答

13

你最好使用面板本身的层级监听器来处理这个问题:

panel.addHierarchyListener(new HierarchyListener() {
    public void hierarchyChanged(HierarchyEvent e) {
        if ((HierarchyEvent.SHOWING_CHANGED & e.getChangeFlags()) !=0 
             && panel.isShowing()) {
          //do stuff
        }
    }
});

1

如果您不想要一个事件,但是有一些特定的代码需要在组件绘制后运行,您可以重写addNotify()方法,该方法被调用以使组件可显示。例如:

public void addNotify()
{
    super.addNotify();
    // at this point component has been displayed
    // do stuff
}

0

在收到WindowListener.windowActivated事件后,您的组件将完全显示。在窗口激活事件之前尝试分配焦点可能会遇到时间问题和竞态条件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接