【问题标题】:Why does JCompnent.getBounds() always return 0 values?为什么 JCompnent.getBounds() 总是返回 0 值?
【发布时间】:2014-08-24 21:38:36
【问题描述】:

当我尝试获取 JPanel 的边界时,它总是返回 ( 我在JPanel类的构造函数中使用this.getBounds()):

java.awt.Rectangle[x=0,y=0,width=0,height=0]

在 Swing 组件的渲染中,这实际上是在什么时候设置的?确定边界大小后是否会发生组件事件?

【问题讨论】:

    标签: java swing jpanel jcomponent bounds


    【解决方案1】:

    在 GUI 的构造函数中,组件还没有被渲染,所以它们的边界是 [0, 0]。只有在 顶级窗口(例如包含 JFrame)上调用 pack()setVisible(true) 后,组件才会呈现。但是你的问题引出了一个问题,为什么你需要这些信息?您打算如何处理这些数据?还有其他可以获取信息并且有用的位置,例如 JComponent 的paintComponent 方法或在 ComponentListener 中。

    【讨论】:

    • +1。不仅它们还没有被渲染,而且它们甚至可能还没有被添加到它们的容器中。所以在这一点上得到他们的界限是没有意义的。
    • 这是我在使用其他一些类时遇到的更多问题,因为我需要将父组件的矩形对象传递给它。这比我现在真正需要了解的要多,并且与我的问题无关。
    【解决方案2】:

    好的,感谢您的回复,但我想通了。基本上我需要从 JComponent 重写 paint() 方法。此时矩形边界已正确生成。真的一点都不复杂。

    更新:

    基于http://www.oracle.com/technetwork/java/painting-140037.html,它建议使用paintComponent() 而不是paint(),即使API 确实允许这样做。这专门处理组件本身,而不是边框​​等所有相关元素。

    【讨论】:

    • 不,请深入阅读图形教程。在那里你会看到你几乎从不想覆盖绘制,有几个原因,但主要是因为它不仅涉及绘制组件,还涉及组件的边框和子项。如果做得不好,你可能会搞砸。正如我在回答中提到的那样,最好覆盖paintComponent,并在覆盖中调用超级方法。链接很快就会给你。
    • 在paint甚至paintComponent中执行这项工作还有其他问题,因为您无法完全控制是否或何时调用这些方法,并且您不希望在这些方法中有任何代码方法或从这些方法调用,这些方法需要花费大量时间才能运行,因为这样做会显着降低 GUI 程序的感知响应能力。这就是为什么使用 ComponentListener 可能会更好的原因之一,但同样,这将取决于您尝试使用它做什么。
    猜你喜欢
    • 2021-01-24
    • 1970-01-01
    • 2016-09-16
    • 2020-05-25
    • 2013-02-26
    • 2013-06-25
    • 1970-01-01
    • 2023-02-02
    相关资源
    最近更新 更多