2011-03-24 25 views
6

Như hầu hết các lập trình viên Java biết, cập nhật đối với Swing GUI chỉ nên được thực hiện trên chuỗi gửi sự kiện AWT và đề xuất là các quy trình chạy dài được thực thi trên luồng "công nhân" với các bản cập nhật được gửi đến chuỗi gửi sự kiện bằng cách sử dụng SwingUtilities.invokeAndWait() hoặc SwingUtilities.invokeLater().Mẫu để chặn người dùng Java Swing trong chuỗi công nhân

Làm cách nào để ngăn người dùng tiếp tục với ứng dụng trong khi quá trình chạy dài được hoàn tất? Bạn có tô xám các điều khiển và sau đó yêu cầu chuỗi công nhân có thể bật lại chúng bằng cách sử dụng các cuộc gọi SwingUtilities được đề cập ở trên không?

Có mẫu thay thế nào tốt hơn không?

+1

Tại sao bạn cần cấm người dùng sử dụng ứng dụng?Nếu có thể bạn muốn tránh làm điều đó và cho phép họ tiếp tục. Nếu bạn hoàn toàn phải, mặc dù, những gì về một hộp thoại phương thức? Bạn cũng có thể tắt các điều khiển. – justkt

+0

Câu hỏi hay. Tôi không biết bất kỳ câu trả lời tiêu chuẩn nào ngoại trừ ProgressMonitor. – keuleJ

+0

@justkt: Nếu quá trình chạy dài ảnh hưởng đến điều đang hiển thị, tôi có thể không muốn người dùng làm bất cứ điều gì khác, ngoại trừ có thể hủy hoạt động. Những gì tôi thường làm là một hộp thoại phương thức với các nút, vv vô hiệu hóa ngoại trừ nút "Hủy bỏ", nhưng tôi hy vọng cho một mô hình tổng quát hơn. Màn hình tiến bộ của – Ralph

Trả lời

3

tôi sẽ xem xét 3 giải pháp:

  • vô hiệu hóa các thành phần của bảng điều khiển: đó là nói chung những gì tôi làm. Thật không may, Swing không cung cấp một cách đơn giản để vô hiệu hóa một bảng điều khiển và tất cả các trẻ em của nó, nhưng nó rất dễ dàng để làm đệ quy (xem this other SO answer cho điều đó). Một vấn đề khác là một số thành phần Swing trông giống nhau khi được bật và tắt (ví dụ: JList)
  • ẩn bảng điều khiển bằng thẻ CardLayout: trong bảng có CardLayout, thêm 2 thành phần. Đầu tiên là bảng điều khiển lưu trữ các thành phần để hủy kích hoạt và thứ hai là bảng điều khiển hiển thị thông báo "đang tải" hoặc "vui lòng đợi". Một đơn giản JLabel trong một Gridbaglayout thực hiện thủ thuật. Sau đó, bạn chỉ cần chuyển từ cái này sang cái khác. Tôi sử dụng kỹ thuật này cho những nơi mà kết quả của một tính toán/yêu cầu sẽ được hiển thị.
  • đặt một số loại thành phần ở đầu bảng điều khiển tiêu thụ sự kiện chuột: bạn có thể tự mình thực hiện với một LayeredPane hoặc bạn có thể sử dụng tiện ích chuyên dụng. JXLayer có thể làm điều đó (tôi đọc rằng JXLayer sẽ được bao gồm trong Java 7, do đó, điều này có thể trở thành giải pháp 'tiêu chuẩn' cho loại vấn đề này).
0

Một cách mà tôi đã thấy nó là sử dụng Jframe.setGlassPane() và đặt thành phần ăn tất cả các sự kiện. Bạn cũng có thể sáng tạo và sử dụng loại flash luân phiên chờ đợi trong kính của bạn. Nhưng lưu ý rằng việc đặt khung kính có thể không phải tất cả những gì bạn muốn. Đối với các yêu cầu nâng cao hơn, bạn có thể phải chơi xung quanh với hàng đợi sự kiện.

2

Có một số cách và lựa chọn trong số đó, chủ yếu phụ thuộc vào thiết kế và bố cục của GUI của bạn.

  • Sử dụng thanh tiến trình - Thay thế bảng hoặc khu vực bạn không muốn người dùng chạm vào thanh tiến trình. Điều này sẽ ngăn cản bạn phải đối phó với các sự kiện bạn không muốn, trong khi vẫn làm cho nó rõ ràng cho người dùng rằng một cái gì đó đang xảy ra trong nền.
  • Tắt nút và thêm con trỏ đợi - Sử dụng setEnable (false) trong khi đang hoàn thành công việc và có thể thay đổi con trỏ thành Con trỏ chờ. Điều này một lần nữa làm cho nó rõ ràng rằng một tùy chọn là không có sẵn nào được nêu ra chỉ trong một thời gian tạm thời.
  • Không trả lời các sự kiện hoặc ném GlassPane - Đây là người dùng ít người dùng hơn vì ứng dụng trông không phản hồi, tuy nhiên nó có thể chấp nhận được trong một số trường hợp.
Các vấn đề liên quan