Dodawanie do JFrame

0

Witam!
Mam problem z JFrame, a mianowicie wyświetla mi tylko jeden obiekt klasy. Mam klasę, która rysuje jakąś tam figurę i przesuwa ją o 1 ptk i znowu rysuje.

(...)
public void paintComponent(Graphics g)
{

      super.paintComponent(g);

      g.drawRect(x, y , 3, 2);
      repaint();

(...)

Tak dodaje obiekty klasy do obiektu JFrame:

           nazwa_obiektu_JFRAME.getContentPane().add(new Pol());
           nazwa_obiektu_JFRAME.getContentPane().add(new Pol());
           nazwa_obiektu_JFRAME.getContentPane().add(new Pol()); 

Jak zrobić by wszystkie obiekty klasy rysującej i poruszającej :p wyświetliło na jednym JFramie?
Pozdrawiam :)

0

Domyślny menadżer rozkładu dla JFrame (tzn. BorderLayout) dzieli okno na pięć obszarów. Metodę add() powinno się wówczas wywoływać z dwoma parametrami: komponent i określenie obszaru, np. tak:

      nazwa_obiektu_JFRAME.getContentPane().add(new Pol(),BorderLayout.CENTER);

Pozostałe obszary, to
BorderLayout.NORTH
BorderLayout.SOUTH
BorderLayout.WEST
BorderLayout.EAST
Możesz też zostawić dotychczasowy sposób dodawania komponentów, ale zmienić menadżera rozkładu:

   nazwa_obiektu_JFRAME.setLayout(new FlowLayout());

Jeżeli Twój program nie będzie uruchamiany na "starej" Javie (chyba<=1.4) to możesz nie używać metody getContentPane() i dodawać komponenty bezpośrednio do JFrame

0

Powieś też sobie nad łóżkiem:
"Nigdy nie będę żądał repaint z paint".
I odmawiaj jak zdrowaśkę przed spaniem... ;)

Dlaczego wywoływanie takie jest nie do przyjęcia? Dlatego, że napełniasz kolejkę Swinga z prędkością jej opróżniania. W efekcie nie różni się to niczym od odmalowywania ekranu w pętli. Obciążasz w ten sposób Swinga, a ten przez to może nie mieć już czasu na obsługiwanie innych komunikatów (np. ruchów myszą, klawiaturą, aktualizacji itd.). Swing aby sobie z tym poradzić olewa Twoje nadmiarowe wywołania łącząc kilka nadchodzących po sobie w jedno. Nie masz nad tym kontroli i nigdy nie będziesz mieć. Kolejka komunikatów Swinga nie jest zaprojektowana do animacji. Koniec kropka.

W Paint nie możesz umieścić sleep, ani kontrolować czasu wysyłania żądania. Możesz natomiast robić to za pomocą swingowego timera, innego wątku z wywołaniami SwingUtilities.invokeLater lub aktywnego renderingu.

Poza tym jeżeli dodajesz jakieś komponenty do panelu okna, to nie dotykasz metody paint tego okna, ani jego panelu. Swing sam wyświetla dodane do okna komponenty przez ich metody paint. Natomiast powinieneś przedefiniowywać paint tych komponentów ponieważ domyślnie metoda ta nie robi nic lub czyści obszar, który obejmuje swoimi rozmiarami na kolor tła.

Jeżeli chcesz sprawdzić jak rysowane są komponenty, to w paincie takiego komponentu odrysowuj prostokąt o rozmiarze tego komponentu i innym kolorze dla każdego obiektu. Ewentualnie podobny efekt uzyskasz przez zdefiniowanie dla komponentu ramki w różnych kolorach lub stylach.

Jak już kolega napisał to co robiłeś to dodawałeś kolejne komponenty nad poprzednimi bo w domyślnym rozkładzie ostatni element przykrywa wszystkie poprzednie w centralnym położeniu.

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