java组件&x27;s getSize()返回负值

java组件&x27;s getSize()返回负值,java,swing,thread-safety,awt,Java,Swing,Thread Safety,Awt,我遇到了一个有趣的情况,在这种情况下,调用JLabel的方法getSize()会间歇性地得到负值。我想调整JLabel的大小以获得最大的空间,但通常我会像中一样将其倒置。似乎在获得负值后的一瞬间,正确的值就出现了。 我几乎可以肯定这是由我糟糕的GUI/逻辑线程体系结构引起的线程竞争问题,但是,我注意到,如果我删除了对父JPanel所做的变通方法,问题就会消失 我已经尝试在执行值赋值时添加同步块,之前我做过jlabel.verify(),但没有任何帮助。不幸的是,我真的需要保留我提到的解决方法 我

我遇到了一个有趣的情况,在这种情况下,调用JLabel的方法getSize()会间歇性地得到负值。我想调整JLabel的大小以获得最大的空间,但通常我会像中一样将其倒置。似乎在获得负值后的一瞬间,正确的值就出现了。 我几乎可以肯定这是由我糟糕的GUI/逻辑线程体系结构引起的线程竞争问题,但是,我注意到,如果我删除了对父JPanel所做的变通方法,问题就会消失

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

我将感谢任何指导来解决这个问题,提前谢谢

以下是一个屏幕截图:


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

我不确定问题的确切原因,但我通过专门设置首选大小(请记住,我的大多数内容返回0,0作为首选大小)解决了这个问题,之前我只打过电话:

setExtendedState( this.getExtendedState()|JFrame.MAXIMIZED_BOTH );
现在:


那张照片没用。我们不知道你的代码在做什么。发布一篇演示问题的文章。
似乎在获得该负值后的一瞬间,就可以使用正确的值。
if
更改为
while
,您就设置好了哈哈哈。。。(但不,你可能应该解决原因而不是结果)好的,我会尽快更新我的MCVE,谢谢!“我通过调用JLabel的方法getSize()得到负值。”自从引入Swing以来,我在Java编码中不得不调用
JLabel
的首选大小大约2到3次。我不得不称之为尺码……从来没有!为什么你认为你需要调用它?我发现组件返回大小是比较常见的。我不认为在我得到值之前,任何其他过程都在改变标签的大小,我更倾向于使用未初始化的值。当我调用pack()时,由于没有首选大小,它可能需要计算它,有时在我更新标签后它会完成一点。如果我特别设置了解决此问题的首选尺寸,请参阅以上注释的更多详细信息。你怎么看?是的,你的理论是可能的。主要的一点是,我们确信某些后台进程正在改变值。
    setExtendedState( this.getExtendedState()|JFrame.MAXIMIZED_BOTH );
    setPreferredSize(getSize());

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