调用函数时按钮不会禁用

时间:2013-11-30 13:09:50

标签: java swing button

我真的迷失了这个: 在这种情况下,按钮在单击时应该是可扩展的(btnStart.setEnable(false))。 在此之后,它应该调用位于其他类中的函数。 一切正常,除了btnStart在点击时没有禁用,但是在调用函数之后。

所以这个:

@Override
public void actionPerformed(ActionEvent buttonKLick) {
    if(buttonKLick.getSource() == this.btnStart){
        btnStart.setEnabled(false);
        try {
            Funktionen.fileFinder(Pfad); //The Function
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

将调用函数FileFinder然后禁用该按钮,但之前应禁用该按钮。

2 个答案:

答案 0 :(得分:3)

您可能遇到了一个线程问题,其他方法需要时间并锁定Swing事件线程,从而阻止Swing正确地将按钮绘制为禁用。如果使用后台线程会发生什么?

即,

if(buttonKLick.getSource() == this.btnStart){
    btnStart.setEnabled(false);
    new Thread(new Runnable() {
      public void run() {
        try {
          Funktionen.fileFinder(Pfad); //The Function
        } catch (FileNotFoundException e) {
          e.printStackTrace();
        }
      }
    }).start();
}

修改

请务必阅读:Lesson: Concurrency in Swing

答案 1 :(得分:3)

不,它会在您拨打setEnabled( false )时禁用该按钮。在调用该函数之前,只需尝试调用isEnabled()

您观察到的是,在执行该功能后,该按钮仅被绘制为禁用状态。那是因为你的函数占用了用于更新UI的唯一线程(事件调度线程)。

解决方案:在工作线程上执行您的功能,例如使用SwingWorker。另外,请阅读Swing concurrency guide。这更详细地解释了我在这里提到的