2012-02-22 24 views

Trả lời

33
  • AWT, ghi đè paint().
  • Đu đưa container cấp cao nhất (ví dụ: JApplet, JFrame, JWindow, JDialog ..), ghi đè paint(). Nhưng có một số lý do chính đáng là không phải để vẽ trong TLC. Một chủ đề cho một câu hỏi riêng biệt, có lẽ.
  • Phần còn lại của Swing, ghi đè paintComponent().
  • Không ghi đè hoặc gọi rõ ràng paintComponents(), để nguyên API đó để gọi khi cần.

Hãy chắc chắn cũng sử dụng ký hiệu @Override bất cứ khi nào ghi đè phương pháp.

Làm như vậy sẽ gợi ý vấn đề cố gắng ghi đè paintComponent(..) trong một số JFrame (không có phương thức như vậy), điều này khá phổ biến để xem.

+0

Xin chào, hàm paint() có được gọi ngay sau khi hoàn thành hàm tạo không? – GMsoF

+0

Hoặc chúng ta phải gọi lại bằng tay()? – GMsoF

+1

@GMsoF 'repaint()' sẽ được gọi tự động khi cần. Nếu hoạt ảnh, nó cũng có thể được gọi một cách rõ ràng. Mặc dù được gọi là quá nhiều lần, quá nhanh, và một số cuộc gọi sẽ được kết hợp (bỏ qua). –

15

Bạn có thể quan tâm đến việc đọc Painting in AWT and Swing

Một câu nói:

Các quy tắc áp dụng cho các thành phần nhẹ AWT cũng áp dụng đối với Swing thành phần - ví dụ, sơn() được gọi khi đó là thời gian để render - ngoại trừ việc Swing yếu tố hơn nữa sơn() gọi vào ba phương pháp riêng biệt, được gọi theo thứ tự sau:

protected void paintComponent(Graphics g) 
protected void paintBorder(Graphics g) 
protected void paintChildren(Graphics g) 

Chương trình Swing phải ghi đè lên paintComponent() thay vì ghi đè sơn(). Mặc dù API cho phép nó, thường không có lý do gì để ghi đè paintBorder() hoặc paintComponents() (và nếu bạn làm như vậy, hãy chắc chắn rằng bạn biết những gì bạn đang làm!). Việc bao thanh toán này giúp các chương trình dễ dàng ghi đè lên chỉ phần của bức tranh mà chúng cần phải mở rộng. Ví dụ, điều này giải quyết vấn đề AWT được đề cập trước đó, nơi một thất bại để gọi super.paint() ngăn chặn bất kỳ trẻ em nhẹ xuất hiện.

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