2011-09-14 40 views
5

Tôi có một lớp đơn giản vẽ một hình ảnh trong một JPanel. Đây là lớp học của tôi:Ai đang gọi phương thức paintComponent() trong lớp của tôi?

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import javax.swing.JPanel; 

class Drawing_panel extends JPanel { 
    public void paintComponent(Graphics g) { 
    super.paintComponent(g);  
    this.setBackground(Color.white); 
    g.setColor(Color.red); 
    g.fillRect(150, 80, 20, 20); 
} 

public Dimension getPreferredSize(){ 
    return new Dimension(500,500); 
} 

}

Tôi đã lớp khác mà instantiates này một:

Drawing_panel dp = new Drawing_panel(); 

Không có constructor trong lớp Drawing_panel và/hoặc không có cuộc gọi rõ ràng để một trong hai paintComponent() hoặc getPreferredSize() phương pháp. Tôi cho rằng phương thức này được gọi trong hàm khởi tạo của cha mẹ là JPanel, nhưng tôi cũng không thấy các cuộc gọi ở đó.

+0

hãy tìm hiểu các quy ước đặt tên java và gắn bó với chúng – kleopatra

Trả lời

6

Số paintComponent được gọi từ một vài địa điểm khác nhau. Cuộc gọi từ JComponent.paint có thể là cuộc gọi bạn đang tìm kiếm.

Lưu ý rằng paintComponentkhông được gọi từ bất kỳ nhà xây dựng nào. paintComponent được gọi là "theo yêu cầu" tức là khi hệ thống quyết định rằng thành phần cần phải được vẽ lại. (Ví dụ có thể là khi thành phần được thay đổi kích cỡ, hoặc khi cửa sổ được khôi phục từ trạng thái thu nhỏ.) Để rõ ràng: Thành phần không được "sơn, sau đó được sử dụng", nó được "sử dụng, sau đó được sơn khi cần".

Toàn bộ chuỗi cuộc gọi vẽ này là không có gì bạn nên bận tâm, vì nó được chú ý hoàn toàn bởi Swing và cái gọi là Event Dispatch Thread.

3

Khi bạn phân lớp JComponent hoặc JPanel để vẽ đồ họa, hãy ghi đè phương thức paintComponent(). Phương thức này được gọi bởi vì người dùng đã làm điều gì đó với giao diện người dùng yêu cầu vẽ lại hoặc mã của bạn đã yêu cầu rõ ràng rằng nó được vẽ lại. Được gọi tự động khi nó hiển thị Khi cửa sổ hiển thị (không bị phát hiện hoặc bị khử) hoặc được thay đổi kích thước, "hệ thống" sẽ tự động gọi phương thức paintComponent() cho tất cả các vùng của màn hình phải được vẽ lại.

+0

@ Jonas - Cảm ơn bạn đã trả lời sâu sắc, đặc biệt là về việc sử dụng phương thức repaint(). Điều đó sẽ có ích. – jamesTheProgrammer

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