Java Swing xác nhận lại () so với sơn lại ()


211

Tôi đang kết hợp một ứng dụng Swing nơi tôi thường muốn thay thế nội dung của JPanel. Để làm điều này, tôi đang gọi removeAll(), sau đó thêm nội dung mới của tôi, sau đó gọi revalidate().

Tuy nhiên tôi thấy rằng nội dung cũ vẫn thực sự hiển thị (mặc dù bị che khuất bởi nội dung mới). Nếu tôi thêm một cuộc gọi repaint()ngoài revalidate(), nó hoạt động như mong đợi.

Tôi chắc chắn vào những dịp khác tôi đã trải nghiệm rằng chỉ cần gọi revalidate()là đủ.

Vì vậy, về cơ bản câu hỏi của tôi là - tôi có nên gọi cả hai chức năng không và nếu không, khi nào tôi nên gọi từng chức năng?


6
Hướng dẫn này từ Oracle tuyên bố: "Luôn luôn gọi lại sau khi xác nhận lại". Không có lời giải thích được cung cấp mặc dù.
phút

Câu trả lời:


154

Bạn cần gọi repaint()revalidate(). Người trước nói với Swing rằng một khu vực của cửa sổ là bẩn (cần thiết để xóa hình ảnh của những đứa trẻ cũ bị xóa removeAll()); cái sau báo cho trình quản lý bố trí tính toán lại bố cục (cần thiết khi thêm các thành phần). Điều này sẽ làm cho con của bảng điều khiển sơn lại, nhưng có thể không làm cho chính bảng điều khiển làm như vậy (xem phần này để biết danh sách các kích hoạt sơn lại).

Trên một lưu ý chung hơn: thay vì sử dụng bảng điều khiển gốc, tôi khuyên bạn nên xây dựng một bảng điều khiển mới và hoán đổi chúng ở phụ huynh.


1
Bạn có thể hợp lý hóa tại sao xây dựng một bảng điều khiển mới là một giải pháp tốt hơn so với việc sử dụng bảng điều khiển cũ? :)
Arttu

3
@Arttu - nó ít hoạt động hơn và do đó ít bị lỗi hơn.
kdgregory

86

Bất cứ khi nào bạn thực hiện remove () hoặc remove ALL (), bạn nên gọi

  validate();
  repaint();

sau khi bạn đã hoàn thành add () 'ing các thành phần mới.

Gọi xác thực () hoặc xác nhận lại () là bắt buộc khi bạn thực hiện xóa () - xem javadocs có liên quan.

Thử nghiệm của riêng tôi chỉ ra rằng sơn lại () cũng là cần thiết. Tôi không chắc chính xác tại sao.


59

revalidateđược gọi trên một container khi các thành phần mới được thêm vào hoặc các thành phần cũ bị loại bỏ. cuộc gọi này là một hướng dẫn để yêu cầu trình quản lý bố trí thiết lập lại dựa trên danh sách thành phần mới. revalidatesẽ kích hoạt một cuộc gọi để sơn lại những gì thành phần nghĩ là 'vùng bẩn'. Rõ ràng không phải tất cả các khu vực trên của bạn JPanelđều bị coi là bẩn bởi RepaintManager.

repaintđược sử dụng để nói với một thành phần để sơn lại chính nó. Nó thường là trường hợp mà bạn cần phải gọi điều này để dọn dẹp các điều kiện như của bạn.


5

revalidate()chỉ yêu cầu bố trí vùng chứa, khi bạn có kinh nghiệm gọi revalidate()công việc đơn giản , điều đó có thể do việc cập nhật các giới hạn thành phần con kích hoạt repaint()khi giới hạn của chúng bị thay đổi trong quá trình bố trí lại. Trong trường hợp bạn đã đề cập, chỉ loại bỏ thành phần và không có giới hạn thành phần nào được thay đổi, trường hợp này không repaint()được kích hoạt "vô tình" .


-4

vâng, bạn cần phải gọi lại (); xác nhận lại (); khi bạn gọi remove ALL () thì bạn phải gọi repaint () và xác nhận lại ()

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.