problem z repaint();

0

Witam. Mam problem z repaint.

class FGUI extends JPanel implements AcionListener{
public FGUI(){
...
canvas = new GridCanvas();
canvas.setVisible(true);
...
}
}


class GridCanvas extends Canvas implements MouseListener{
public void paint(Graphics g) {
	 g2 = (Graphics2D) g;
         ...//tutaj mnóstwo rysowania linii itd.
         while(true)
            repaint();
}
public static void standardStart() {
       ...
	GridCanvas.drawLine(10,10,500,500);
        ...
}}

Kod robi to czego się niestety spodziewałem - 100% użycia procka i nic nie mogę robić z programem. Jak ustawię sleep użycie procka spada, program dalej 'zamrożony' - ale to i tak tylko półśrodek. Moim pytaniem jest więc: jak w takim przypadku update'ować canvas? Zewnątrz painta używając metody należącej do klasy?
Z góry dziękuję za odpowiedź, męczę się z tym już długo.

0

Myślę, że problem tkwi w tym, że robisz repaint() w repaint() i to dodatkowo w pętli.
repaint() ma być wywoływany tylko wtedy kiedy coś się zmienia, np. wciskasz klawisz.

0

sorry, nie repaint() w repaint() tylko repaint() w paint()

0

Ok, ale kiedy w jakiejkolwiek metodzie poza paint umieszczałem FGUI.canvas.repaint(); bądż samo repaint(); kompletnie nic się nie działo. Sugerujesz żeby zaprząc do tego któregoś listenera?

0

Wrzuciłem w mouseListenera w mouseClicked i : okienko nie freezuje, mogę robić co chcę, ale też niczego nie rysuje repaintem... Jedynie widać że po każdym kliknięciu jest jakby refresh obrazu ale nic się nie zmienia.

0
elzabbul napisał(a)

Ok, ale kiedy w jakiejkolwiek metodzie poza paint umieszczałem FGUI.canvas.repaint(); bądż samo repaint(); kompletnie nic się nie działo. Sugerujesz żeby zaprząc do tego któregoś listenera?

Canvas używam tylko w J2ME, ale zasada jest raczej podobna. Podobnie pisze się OpenGL. Jeżeli kiedyś używałeś to może Ci pomóc.

Zazwyczaj robię to tak:

  • deklaruje w klasie pewne zmienne
  • co jakiś czas wywoływana jest jakaś metoda
  • metoda ta zmienia wartości tych zmiennych
  • potem wywołuję repaint() i mam nowy obrazek

Np, jeżeli zmienna left ma oznaczać położenie z lewej strony jakiegoś kwadratu i kwadrat ten ma się przesuwać co pół sekundy o 1 piksel w lewo, to nie robię tego na pewno w metodzie paint()
Tworzę jakąś klasę, która dziedziczy po TaskTimer i w niej przeciążam metodę run()
W metodzie tej ustawiam left--
Potem wywołuje repaint()
W konstruktorze klasy dziedziczącej po Canvas wywołuje Timer

Teraz co taki czas jaki określiłem w timerze wywoła się metoda run() która zmniejszy wartość zmiennej left o 1. Potem jest repaint() a wiec zaczyna działać metoda paint, która każe narysować kwadrat, używając zmiennej left. Zmienna left jest o 1 piksel mniejsza, a więc kwadrat jest przesunięty troszkę w lewo.

Oczywiście nie trzeba używać timera. Odmalowanie może nastąpić po naciśnięciu przycisku. Wtedy przeciążamy metodę keyPressed(int key). W zależności od wciśniętego klawisza robimy obliczenia, no i oczywiście na koniec wywołujemy repaint() :-)

0

Może pochwal się czy się udało...

1 użytkowników online, w tym zalogowanych: 0, gości: 1