Problem z użyciem metody paint()

0

Witam,

Zaczynam programować w języku Java, doszedłem do momentu gdzie próbuje stworzyć prostą grę z użyciem Swing.
W klasie posiadam metodę gdzie wykonywane są przeliczenia koordynatów potrzebnych do wyświetlenia obrazków,w metodzie tej głowny element stanowi pętla while, nie mam pojęcia gdzie w tym wszystkich umieści wywołanie metody repaint(), jeżeli przekopjuje kod metody z wyliczeniami do metody paint() na ekranie nic nie pokaże, jeżeli usunę pętle while() to pokaże się obraz ale tylko pierwszy krok, jeżeli zostawię metodę paint() pustą tzn. tylko z definicja i deklaracja Graphics2D oraz RenderingHints i wywołam repaint() w środku pętli while() to pokaże się tylko to co jest w metodzie paint(). Mam nadzieję ,że opisałem mój problem w miarę zrozumiale. Proszę pomóżcie .

0

Proponuję najpierw: Google + "how to repaint in swing" ;)

0

Poszukałem, przeczytałem ale dalej nie rozumiem. Może ktoś będzie taki dobry i wytłumaczy mi dlaczego w

int counter = 0;
while(counter<100){
counter++;
repaint();
}

Najpierw następuje inkrementacja countera do 99 a dopiero później wywołuje repaint().

0

O ile pamiętam, to żądania odmalowania nie są kolejkowane, tylko łączone ze sobą - zatem nawet jak wywołasz repaint() 100 razy a on się w między czasie nie wywoła, to gdy się już wywoła, to zostanie wywołany tylko raz.
Po drugie jest metoda: http://docs.oracle.com/javase/6/docs/api/javax/swing/JComponent.html#paintImmediately%28int,%20int,%20int,%20int%29 ale należy jej używać bardzo uważnie ze względu na wątek EDT.
Po trzecie próbowałeś się bawić z invalidate(), itp ?

0

Dzięki za odpowiedź i linka, na razie używałem tylko repaint().

1

Wykorzystaj Timer, który co pewien czas (np. 0,1 sekundy) wykona obliczenia i wywoła repaint.

0

A od czego zależy to czy metoda repaint() zostanie wywołana czy nie ?

1

Zależy to od wątku obsługi zdarzeń SWINGa (tzw. EDT). Wywołując repaint() dajesz tylko wskazówkę - odmaluj mi to, jak będziesz miał czas. I EDT, jak znajdzie czas, to odmalowuje.

0

Dzięki za odpowiedzi, jak użyłem Timera to repaint() się "wywołuje", jeszcze mam jeden problem, w funkcji obliczającej koordynaty mam pętle wewnątrz nich wyświetlam poszczególne obrazki i w związku tym muszę do metody obliczającej przekazać argument Graphics g z metody paint(). Czy jest możliwość żeby w jakiś sposób wszystkie wywołania metod które używają obiektu Graphics przenieść do metody paint() a w funkcji obliczającej wywołać tylko metode repaint() ? Jeżeli ten sposób jest niewykonalny, w jaki sposób Wy to Robicie albo jak Byście to Zrobili?

0

Chyba głupoty powypisywałem w ostatnim poście :)

Jeszcze jedno pytanie, jak Tworzycie program który odrysowuje różne sceny to w metodzie main tworzycie obiekt JFrame i każda inna scena niezależna od siebie jest jako osobny obiekt LoadImageApp ?

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