为什么Java没有按时间顺序执行命令?

Zio*_*ion 1 java swing

单击按钮时设置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)

Rob*_*bin 5

原因很简单: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调用中.