Tôi có một ứng dụng Java sử dụng SwingWorker để cập nhật nhãn và thanh tiến trình trong GUI và hoạt động tốt. Tuy nhiên, tôi muốn thêm một tính năng vào cài đặt này.cách cập nhật GUI từ swingworker trả về hai giá trị khác nhau
Nhân viên xoay vòng của tôi thực hiện tác vụ có độ dài n
và lặp lại tác vụ đó m
lần. Ngay bây giờ GUI của tôi chỉ cho tôi biết có bao nhiêu thời gian nhiệm vụ đã được lặp đi lặp lại, nhưng tôi muốn nó cũng cho tôi biết thời gian của nhiệm vụ mà chúng ta đang ở. Nói n=300
và m=50
, tôi muốn một cái gì đó như:
Task 49 is at 248()
Task has been repeated 48 times
Tôi nên sửa đổi gì trong SwingWorker?
/**
*
* @author digitaldust
*/
public class Model extends SwingWorker<Integer, Integer> {
private HashMap<String, Number> GUIparams;
private int session;
private int ticks;
Model(HashMap<String, Number> KSMParams) {
GUIparams = KSMParams;
session = (Integer)GUIparams.get("experimentsInSession");
ticks = (Integer)GUIparams.get("howManyTicks");
}
/**
* Actual simulation
*/
@Override
protected Integer doInBackground() throws Exception {
int i=0;
while(!isCancelled() && i<session){
i++;
int ii=0;
while(!isCancelled() && ii<ticks){
// this is n, the task length and I'd like to update the GUI with this value
ii++;
}
System.out.println(i);
// this is m, how many time the task has been repeated, and now it is updated in the GUI
publish(i);
setProgress(i);
Thread.sleep(1000);
}
return i;
}
/**
* Invoked when simulation exits
*/
@Override
protected void done() {
if (isCancelled()) {
Logger.getLogger(Model.class.getName()).log(Level.WARNING, "Experiment session cancelled by user. Closing Session...");
} else {
// do stuff
Logger.getLogger(Model.class.getName()).log(Level.WARNING, "Experiment session ended.");
}
}
}
+1: cùng một ý tưởng như tôi, nhưng sớm. –
cảm ơn cho gợi ý, chỉ là một điều nhỏ: làm thế nào để lấy lại giá trị cho GUI? Mã của tôi không hoạt động nữa: nếu ("tiến trình" .equals (evt.getPropertyName())) { tiến trìnhBar.setValue ((Số nguyên) evt.getNewValue()); showTaskLabel.setText ("Thử nghiệm" + (Số nguyên) evt.getNewValue() + "đã ký kết.");} Cảm ơn bạn đã giúp đỡ. – user299791
@SimoneGabbriellini Dường như bạn đang nghe thuộc tính 'progress'. Thuộc tính này là 'Integer' và bạn có thể sử dụng nó để cập nhật thanh tiến trình như trong bình luận của bạn. Để có được quyền truy cập vào các kết quả tiến trình trung gian, bạn nên ghi đè lên phương thức 'process()'. Xem chỉnh sửa của tôi để biết ví dụ. – tenorsax