Sự hiểu biết của tôi là nếu tôi bắt đầu một chuỗi khác để thực hiện một số hành động, tôi cần phải SwingUtilities.invokeAndWait
hoặc SwingUtilities.invokeLater
để cập nhật GUI trong khi tôi đang ở trong chuỗi đã nói. Nêu tôi sai vui long chân chỉnh tôi.Java's Swing Threading
Điều tôi đang cố gắng thực hiện tương đối đơn giản: khi người dùng nhấp vào gửi, tôi muốn (trước khi thực hiện bất kỳ hành động nào) vô hiệu hóa nút gửi, thực hiện tác vụ và vào cuối hành động bật lại nút. Phương pháp của tôi để thực hiện hành động cập nhật GUI trực tiếp (hiển thị kết quả) khi nó nhận được kết quả.
Hành động này về cơ bản sẽ truy vấn máy chủ và nhận lại một số kết quả.
Những gì tôi có cho đến nay là:
boolean isRunning = false;
synchronized handleButtonClick() {
if (isRunning == false) {
button.setEnabled(false);
isRunning = true;
doAction();
}
}
doAction() {
new Thread() {
try {
performAction(); // Concern A
} catch (...) {
displayStackTrace(...); // Concern B
} finally {
SwingUtilities.invokeLater (/* simple Runnable to enable button */);
isRunning = false;
}
}
}
Đối với cả hai mối quan tâm của tôi ở trên, tôi sẽ phải sử dụng SwingUtilities.invokeAndWait
kể từ khi cả hai đều sẽ cập nhật giao diện? Tất cả các bản cập nhật GUI xoay quanh việc cập nhật JTextPane
. Tôi có cần phải kiểm tra thread của tôi nếu tôi đang trên EDT và nếu như vậy tôi có thể gọi mã của tôi (bất kể nó cập nhật GUI hay không) và không sử dụng SwingUtilities.invokeAndWait
?
EDIT: Đây là những gì tôi đang làm bây giờ:
handleButtonClick() {
if (isRunning == true)
return;
disable button;
SwingWorker task = new MyTask();
task.execute();
}
...inside MyTask
doInBackground() {
return performAction();
}
done() {
result = get();
enable button;
isRunning = false;
interpret result (do most of the GUI updates here);
}
Trong khi performAction()
hiện một số cập nhật giao diện, tôi đã quấn những người trong:
if (SwingUtil.isEDT())
doGUIupdate()
else
SwingUtil.invokeLater(new Runnable() {
run() {
doGUIupdate();
}
});
Hy vọng rằng đây là một bước đi đúng hướng , xin vui lòng bình luận nếu bạn tin rằng có những cách tốt hơn để xử lý tình hình của tôi.
Sử dụng SwingWorker. http://java.sun.com/javase/6/docs/api/javax/swing/SwingWorker.html –
Tôi đã ấn tượng rằng SwingWorker nên được sử dụng cho một cái gì đó "dài" trong khi SwingUtilities được sử dụng cho một cái gì đó "nhanh" ? – nevets1219
Bởi vì SwingUtilities thực hiện trên luồng "UI", nó sẽ phải được sử dụng cho một cái gì đó nhanh chóng để được thực tế; nếu không nó có thể chặn giao diện người dùng. Sẽ không thực thi trong "chuỗi khác". –