【问题标题】:java Component's getSize() returning negative valuesjava 组件的 getSize() 返回负值
【发布时间】:2014-01-15 16:57:15
【问题描述】:

我有一个有趣的情况,我通过调用 JLabel 的方法 getSize() 间歇性地得到负值。我想调整 JLabel 的大小以尽可能获得最大空间,但我经常把它颠倒过来,就像在 this question 中一样。似乎在获得该负值后的瞬间,正确的值就可用了。 我几乎可以肯定这是由我的不良 GUI/逻辑线程架构引起的线程竞争问题,但是,我注意到如果我删除了我对父 JPanel 所做的this 解决方法,问题就会消失。

我已经尝试在赋值时添加一个同步块,我之前做过 jlabel.verify() 但没有任何帮助。不幸的是,我真的需要保留我提到的解决方法。

如果有任何解决此问题的指导,我将不胜感激,在此先感谢。

这是截图:

【问题讨论】:

  • 该图像没有帮助。我们不知道您的代码在做什么。发布一个 MCVE 来说明问题。
  • It seems that an instant after acquiring that negative value the right one is available.if 更改为while,你就设置好了 ahahahahaha...(但不,你应该解决原因而不是结果)
  • 好的,我一有MCVE就更新,谢谢!
  • “我通过调用 JLabel 的方法 getSize() 得到负值。” 我不得不调用 JLabel 的首选大小大约 2 或 3 次自从引入 Swing 以来,在我的 Java 编码中。我不得不调用大小 ..never! 你为什么认为你需要调用它?
  • 我发现组件在新的时候返回大小

标签: java swing thread-safety awt


【解决方案1】:

发生这种情况的唯一方法是,如果另一个进程在分配 componentWidth 变量的时间和您读取其值的时间之间更改 jlabel。一种可能的情况是 jlabel 的初始化发生在后台线程中,并且在您分配 componentWidth 变量时未完成。

【讨论】:

  • 我认为在我获得值之前没有任何其他过程正在改变标签的大小,我更多地使用未初始化的疯狂值。有可能当我调用 pack() 时,由于没有首选大小,它必须计算它,并且有时在我更新标签后它会完成一点。如果我专门设置了首选尺寸,这个问题就解决了,上面的 cmets 有更多详细信息。您对此有何看法?
  • 是的,你的理论是可能的。重点是我们确定某个后台进程正在更改该值。
【解决方案2】:

我不确定到底是什么导致了这个问题,但我通过专门设置首选大小解决了这个问题(请记住,我的大部分内容都返回 0、0 作为首选大小),然后才调用:

setExtendedState( this.getExtendedState()|JFrame.MAXIMIZED_BOTH );

现在:

    setExtendedState( this.getExtendedState()|JFrame.MAXIMIZED_BOTH );
    setPreferredSize(getSize());

@Override
public void paint(Graphics g) {
    setPreferredSize(getSize()); // Update to current size
    super.paint(g);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    相关资源
    最近更新 更多