2011-08-01 38 views
8

Tôi có một JPanel với chức năng paintComponent(). Tôi sẽ gọi nó một lần, sau đó khi người dùng nhấp vào một khác nhau JButton, tôi sẽ đặt một số cờ và muốn gọi lại chức năng này vì nó sẽ làm điều gì đó hơi khác sau khi cờ được đặt.Xóa đồ họa và sơn lại đồ họa của JPanel?

Vì vậy, đây là những gì tôi tự hỏi: làm cách nào để xóa nội dung hiện có từ paintComponent? Và để vẽ lại, tôi có gọi lại số paintComponent không?

Hiện nay tôi đang cố gắng như sau:

flag2 = true; 
repaint(); //I expect (want) paintComponent to be called again 

Trong thành phần sơn, tôi làm công cụ như:

if (flag2==true) { 
    g.drawRect(...); 
} else { 
    g.drawLine(...); 
} 

Nhưng qua thử nghiệm nó có vẻ như có cái gì đó sai trái với những gì tôi đang làm.

Cảm ơn bạn đã được trợ giúp.

+0

Bạn không gọi repaint() từ bên trong phương thức paintComponent, phải không? Bạn có chắc chắn cuộc gọi repaint() được liên kết với bảng điều khiển bạn muốn làm mới không? (ví dụ: myPanel.repaint())? –

Trả lời

14

Khi bạn thay đổi thuộc tính của bảng điều khiển thì bạn cần phải gọi:

panel.repaint(); 

gây ra các thành phần được sơn lại.

Sau đó báo cáo kết quả đầu tiên trong phương pháp paintComponent() nên:

super.paintComponent(g); 

này sẽ sơn nền vì vậy bây giờ bạn có thể làm sơn tùy chỉnh của bạn.

Nếu bạn cần thêm trợ giúp thì hãy đăng SSCCE để chứng minh sự cố.

2

Trước tiên, tại sao không sử dụng enum thay vì boolean?

enum Enum { 
    RECTANGLE, 
    LINE, 
    CIRCLE 
} 

Enum choice = RECTANGLE; //default to RECTANGLE 

switch(choice) { 
    // case RECTANGLE, LINE, CIRCLE 
} 

Liên quan đến vấn đề của bạn, bạn có thể trả lời nhận xét của tôi trong câu hỏi của bạn không?

+0

Logic tôi có là tốt, tôi có lẽ có thể sử dụng enum nhưng bất cứ điều gì đó không phải là vấn đề của tôi. Vấn đề của tôi là tôi cần phải xóa tất cả các đồ họa được vẽ và sau đó gọi paintComponent một lần nữa bằng cách nào đó cho JPanel này. – JDS

+0

Bạn không cần phải xóa tất cả đồ họa để đạt được những gì bạn muốn. –

+0

Xem câu trả lời của camickr, nếu bạn không làm những gì anh ta vạch ra, hãy tập trung vào điều đó trước tiên. –

2

Tôi khuyên bạn nên gọi revalidate(); thay vì repaint(). revalidate() cần được gọi khi thay đổi kích thước/bố cục hoặc khi bạn thêm/xóa các đối tượng vào jpanel của bạn và sẽ cập nhật tất cả các con của nó. Từ những gì tôi có thể nói, bạn vẫn đang sử dụng cùng một đối tượng vẽ nhưng thay đổi bố cục của nó.