我真的迷失了这个:
在这种情况下,按钮在单击时应该是可扩展的(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
和然后禁用该按钮,但之前应禁用该按钮。
答案 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。这更详细地解释了我在这里提到的