Tôi đang cố gắng sử dụng một SwingWorker để thực hiện một nhiệm vụ dài và cập nhật một JLabel với kết quả:Java GUI đông đặc ngay cả với SwingWorker
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
new SwingWorker<String, Void>() {
@Override
protected String doInBackground() throws Exception {
return doCalculation();
}
protected void done() {
try {
label.setText(get());
} catch (InterruptedException e) {
System.out.println("thread was interrupted");
} catch (ExecutionException e) {
System.out.println("there was an ExecutionException");
}
}
}.execute();
}
});
tôi có thể nhấp vào nút nhiều lần như tôi thích và Gui sẽ vẫn đáp ứng cho đến khi hai luồng được hoàn thành tại thời điểm mà Gui bị đóng băng trong khi các luồng đang chạy. Nếu tôi chỉ chạy một luồng tại một thời điểm, vấn đề này vẫn xảy ra.
Tôi sẽ rất tuyệt nếu có ai có thể chỉ ra nếu tôi đang sử dụng SwingWorker không chính xác hoặc nếu có một vấn đề khác mà tôi không biết. Cảm ơn vì đã dành thời gian cho tôi. Ian
Sửa
Các doCalculation() chỉ là một cái gì đó tốn thời gian:
private String doCalculation() {
for (int i = 0; i < 10000000; i++) {
Math.pow(3.14, i);
}
return threads++ + "";
}
Tôi không thấy bất cứ điều gì rõ ràng là sai với mã bạn đã đăng cho đến nay, nhưng tôi nghĩ chính ở đây là những gì đang diễn ra trong phương thức 'doCalculation();'. Bạn có thể gửi mã này không? –