我有一个有趣的情况,间歇性地从调用JLabel的方法getSize()得到负值。我想调整JLabel的大小以获得尽可能大的空间,但通常我会像this question那样颠倒它。似乎在获得负值后立即获得正确的值。 我几乎可以肯定这是由我糟糕的GUI /逻辑线程架构引起的线程争用问题,但是,我注意到如果我删除了我对父JPanel所做的this解决方法,问题就会消失。
我已经尝试在进行值赋值时添加一个synchronized块,之前我做了jlabel.verify(),但没有任何帮助。不幸的是,我真的需要保持我提到的解决方法。
我将非常感谢您提前解决此问题的任何指导。
以下是截图:
答案 0 :(得分:1)
这种情况发生的唯一方法是,如果另一个进程正在更改分配时间componentWidth变量和读取其值的时间之间的jlabel。可能的情况是jlabel的初始化发生在后台线程中,并且在分配componentWidth变量时未完成。
答案 1 :(得分:0)
我不确定究竟是什么导致了这个问题,但是我通过专门设置首选大小来解决它(请记住,我的大部分内容都返回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);
}