2011-08-01 15 views
8

Mam JPanel z funkcją paintComponent(). Zadzwonię do niego raz, a kiedy użytkownik kliknie inny JButton, ustawię flagę i chcę ponownie wywołać tę funkcję, ponieważ po ustawieniu flagi zrobi się coś innego.JPanel Graphics czyszczenie i malowanie?

Oto, o co się zastanawiam: jak usunąć istniejące elementy z paintComponent? A żeby przerysować, czy mogę ponownie zadzwonić pod numer paintComponent?

Obecnie usiłuję następujące:

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

W składnikiem farb, robię rzeczy jak:

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

Ale poprzez testowanie wydaje się, że coś jest nie tak z tym, co ja robić.

Dzięki za pomoc.

+0

Nie wywołujesz odświeżania() z metody paintComponent, prawda? Czy na pewno wywołanie repaint() jest powiązane z panelem, który chcesz odświeżyć? (np. myPanel.repaint())? –

Odpowiedz

14

Po zmianie właściwości panelu to trzeba powołać:

panel.repaint(); 

spowodować komponent być przemalowany.

Wtedy pierwszy rachunek w metodzie paintComponent() powinny być:

super.paintComponent(g); 

To będzie malować tła, dzięki czemu można teraz zrobić swój własny obraz.

Jeśli potrzebujesz więcej pomocy, opublikuj swój SSCCE, który pokazuje problem.

2

Po pierwsze, dlaczego nie używać wyliczenia zamiast wartości boolowskiej?

enum Enum { 
    RECTANGLE, 
    LINE, 
    CIRCLE 
} 

Enum choice = RECTANGLE; //default to RECTANGLE 

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

Co do swojego problemu, czy możesz odpowiedzieć na moje uwagi w pytaniu?

+0

Logika, którą mam, jest w porządku, prawdopodobnie użyłbym enum, ale cokolwiek to nie jest mój problem. Mój problem polega na tym, że muszę wyczyścić wszystkie narysowane grafiki, a następnie jakoś ponownie wywołać paintComponent dla tego JPanela. – JDS

+0

Nie trzeba usuwać całej grafiki, aby osiągnąć to, co chcesz. –

+0

Zobacz odpowiedź camickra, jeśli nie robisz tego, co nakreślił, najpierw skup się na tym. –

2

Sugerowałbym wywołanie revalidate(); zamiast przemalowywania(). revalidate() wymaga wywołania podczas zmiany rozmiaru/układu lub dodawania/usuwania obiektów na twoim jpanelu i aktualizowania wszystkich jego elementów potomnych. Z tego co wiem, wciąż używasz tego samego obiektu do malowania, ale zmieniając jego układ.