2013-01-15 40 views
5

Tôi đang cố gắng hiểu khi nào sử dụng revalidate/repaint/pack.Chu kỳ làm mới Swing

Đáng ngạc nhiên là tôi không tìm thấy tài liệu chi tiết dưới dạng chi tiết (cảm thấy tự do liên kết).

Cho đến nay tôi đã hiểu rằng đây là tất cả trách nhiệm của Người quản lý lại.

  • sơn/sơn lại đề cập đến những gì họ coi là bẩn/sạch
  • gói/xác nhận/hợp lệ lại đề cập đến những gì có giá trị

This article on Oracle giải thích rằng gọi một repaint enqueues một công việc trên sự kiện Dispatcher Chủ đề mà sẽ lần lượt gọi paintImmediately() trên thành phần (điều này vẽ lại thành phần).

This trail cho biết rằng có hoặc không hợp lệ được liên kết với Trình quản lý bố cục. Và đó là tất cả về kích thước của thành phần chứ không phải là nội dung.

  1. Có đúng là bạn nên gọi xác thực lại khi bạn di chuyển/thay đổi kích thước thành phần của bạn và sơn lại khi bạn thay đổi nội dung của nó?
  2. Phương thức pack() thực sự là một điều không được chấp nhận mà bạn không bao giờ nên gọi?
  3. Có bất kỳ xác nhận quyền sở hữu nào ở trên không đúng không?

Trả lời

6

Dưới đây là một vài trường hợp cơ bản mà bạn cần gọi các phương pháp đó (tôi đề cập đến các vấn đề cơ bản nhưng có thể đã bỏ lỡ một số trường hợp khác).

  1. Bạn nên gọi revalidate() trên một container khi bạn đã hoặc: thêm một hoặc một thành phần hơn, loại bỏ một hoặc nhiều thành phần, thay đổi những hạn chế của một hoặc chứa nhiều thành phần (hạn chế hoặc XXXSize(), mặc dù sau này là không được khuyến nghị), đã thay đổi số LayoutManager của vùng chứa.
  2. Bạn nên gọi repaint() bất cứ khi nào bạn muốn thành phần đó (và hậu duệ của nó) được sơn lại. Cuối cùng, điều này sẽ gọi paintComponent() (đối với các tiện ích cơ bản này sẽ ủy quyền cho XXXUI.paint()), paintBorder()paintChildren() (ít nhất là trong Swing)
  3. pack() thực sự đặt kích thước của cửa sổ thành kích thước ưa thích. Bạn nên thường gọi nó ngay trước khi hiển thị cửa sổ. Bạn có thể gọi nó là sau này nhưng điều này sẽ cung cấp cho người dùng một trải nghiệm kỳ lạ (tôi không biết nhiều ứng dụng mà thay đổi kích thước cửa sổ của họ một lần hiển thị)

Ưu điểm chính của việc sử dụng revalidate()repaint() là họ có thể kết thành một khối mình. Điều này có nghĩa rằng nếu bạn gọi nhiều lần repaint(), bức tranh sẽ chỉ được thực hiện một lần.

+0

Bạn có thể xác định sơn về những thay đổi mà nó ngụ ý không? Tôi bắt đầu nghi ngờ tôi hoàn toàn hiểu ý nghĩa của nó. – kotoko

+1

@kotoko Tôi không chắc chắn tôi đang nhận được những gì loại câu trả lời của bạn tìm kiếm (wrt bình luận của bạn). Khi bạn vẽ (thực hiện phương thức 'paintComponent()', nó có nghĩa là bạn vẽ các đường thẳng, hình tròn (đầy hoặc không), hình chữ nhật (đầy hoặc không), hình ảnh, văn bản, v.v ... (tất cả các thao tác bạn có thể thực sự gọi trên 'Graphics/Graphics2D'). –

+0

Tôi đã cố gắng để hiểu những gì phương pháp kích hoạt những gì.Bây giờ tôi nhận được nó (quy tắc của ngón cái): hoạt động liên quan đến bố cục/thành phần ảnh hưởng đến nếu hợp lệ (1.) của bạn; Các hoạt động đồ họa/Graphics2D ảnh hưởng nếu bẩn. – kotoko

Các vấn đề liên quan