【问题标题】:When is a Swing component 'displayable'?Swing 组件何时“可显示”?
【发布时间】:2010-10-27 02:15:47
【问题描述】:

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

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

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

谢谢。

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

【问题讨论】:

  • 不要保存 Graphics 对象。它可能会因多种原因而改变。

标签: java swing graphics


【解决方案1】:

我一直使用 Coomponent.addNotify 来了解组件何时可以渲染。不确定是否是最好的方法,但它对我有用。当然你必须子类化组件。

Component.isDisplayable 应该是正确的答案,但我知道它并没有像我想象的那样对我有用(我不记得为什么,但有一些东西我切换到 addNotify)。

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

【讨论】:

    【解决方案2】:

    添加层次监听器

    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));
    

    【讨论】:

    • 这绝对是我的问题的最佳答案,尽管我认为我会接受 wilums2 的调整大小建议,因为无论如何我都会听这个事件。谢谢。
    • 类需要:实现 HierarchyListener
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多