单击按钮时设置JLabel时我遇到了这个问题,就像加载图标一样.p.make()执行该方法,但在Method返回Label可见后,Label仍然不可见.有人可以解释发生了什么吗?
的actionPerformed:
String[] args = {jTextFieldDrgzusatzVariable.getText(),jTextFieldAusgabe.getText(),"C:\\CPOracle",jTextFieldKatalog.getText()};
this.jLblLoading.setVisible(true);
if(jLblLoading.isVisible()){
try{
new P21Make(args[0],args[1],args[2],args[3]).make();
}catch(Exception e){
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
原因很简单:Swing是单线程的(有关更多信息,请参阅Swing并发教程).
会发生的是actionPerformed在Swing线程(E(vent)D(ispatch)T(hread))上调用该方法.当...的时候
this.jLblLoading.setVisible(true);
Run Code Online (Sandbox Code Playgroud)
达到声明,它会立即标记jLblLoading为可见.但是,这对UI没有任何影响.在可见性更改产生任何影响之前,需要重新绘制UI.此重绘是在EDT上安排的(与立即执行的不同).
这解释了为什么你的
if(jLblLoading.isVisible()){
Run Code Online (Sandbox Code Playgroud)
检查成功,你仍然没有看到UI的差异.该组件被标记为可见,但重绘仍处于待处理状态.重新绘制将保持待定状态,直到EDT再次可用.由于当前占用EDT的东西是您的actionPerformed调用,该方法中的其余代码actionPerformed将在重绘之前执行(意味着在您看到UI中的更改之前).
使用不同线程的解决方案确实可以解决这个问题.但是,如果new P21Make(...).make()不影响UI ,则只能使用它.如果该语句以任何方式与Swing组件交互,则应该在EDT上执行.在这种情况下,另一种方法是将语句包装在一个SwingUtilities#invokeLater调用中.
| 归档时间: |
|
| 查看次数: |
120 次 |
| 最近记录: |