Điều này dành cho các chuyên gia về swing. Tôi đã dành thời gian đáng kể cho vấn đề này, vì vậy nó sẽ đưa tôi một vài dòng để giải thích vấn đề.Thanh tiến trình xoay Java từ sự cố EDT
Tôi có một ứng dụng java độc lập (java 6). Trong ứng dụng của tôi, tôi có một khung với một nhóm nút radio. Tôi có một hành động được liên kết với tất cả các nút trong nhóm. Thao tác kiểm tra để xem nút radio nào được chọn và thực hiện một số thao tác. Các "công việc" liên quan đến một số tính toán nền cũng như một số bức tranh trong hai khung khác trong ứng dụng của tôi. Tính toán nền là đa luồng.
Tôi muốn hiển thị thanh tiến trình khi người dùng chọn một trong các nút radio. Tuy nhiên, khi nút radio được chọn, trong khi thao tác với nút radio đang diễn ra, thanh tiến trình sẽ không bao giờ xuất hiện. Tôi đã thử jdialog loại thanh tiến trình, tấm kính, vv Không ai trong số họ xuất hiện cho đến khi "công việc" là tất cả hoàn thành. Điều này có vẻ là vì Swing không hoàn thành việc vẽ nút radio cho đến khi "công việc" trong hành động tương ứng được hoàn thành. Và kể từ khi EDT chỉ làm một điều tại một thời điểm, hộp thoại thanh tiến trình (hoặc ngăn kính) không bao giờ được hiển thị.
Sau đó tôi đã cố gắng sử dụng SwingWorker để thực hiện tất cả "công việc" này. Bắt đầu thanh tiến trình (hoặc kích hoạt một ngăn kính), bắt đầu SwingWorker và đóng thanh tiến trình (hoặc tắt khung kính) trong phương thức done() cho SwingWorker. Điều này dường như mang lại thanh tiến trình tốt, nhưng bức tranh mà là một phần của "công việc" đôi khi không hoàn thành, để lại cho tôi một số đồ tạo tác (phương pháp paintComponent khá phức tạp, vì vậy không muốn sao chép ở đây). Các đồ tạo tác biến mất nếu tôi thay đổi kích thước cửa sổ. Trong thực tế, điều này xảy ra nếu tôi sử dụng một lớp mở rộng Thread thay vì SwingWorker. Điều này là tất cả bởi vì Swing không phải là threadsafe và tôi đang cố gắng làm công việc GUI từ một chủ đề khác với EDT. Tôi hiểu phần đó.
Tôi phải làm gì? "công việc" mất khoảng 30 giây và dường như quá dài để đi mà không hiển thị cho người dùng một số loại chỉ báo rằng chương trình đang hoạt động. Tôi cũng đã cố gắng thay đổi con trỏ đến một con trỏ chờ và đã chạy vào các vấn đề tương tự như trên. Điều duy nhất mà tôi có thể làm là tắt khung và đặt tiêu đề của khung thành một số văn bản như "đang hoạt động ..."
Bất kỳ ai đã gặp sự cố này trước đây?
Làm cách nào để đảm bảo rằng EDT không thực hiện bất kỳ bức tranh nào khác cho đến khi công việc trên luồng SwingWorker hoàn thành? Công việc có thể được thực hiện trong nền phải được hoàn thành trước khi khung hình của tôi được sơn lại. – Anu
Cảm ơn bạn! Tôi đã làm việc đó. – Anu