Wątek przeniesiony 2014-05-27 07:58 z Java przez bogdans.

nie działający repaint

0

Witam, bawię się swingiem w javie i mam niestety pewien problem. Podczas przesuwania kulki po ekranie, ona się mnoży i nie czyści za nią ekranu. A to kawałek kodu:

 

 

    public void init() {
        
        this.setSize(width, height);
        this.setBackground(Color.GRAY);
        plansza.stworzPlansze();
        super.addKeyListener(this);
        //super.requestFocus();
        

    }

    @Override
    public void update(Graphics g) {
        grafika.clearRect(0, 0, width, height);
        paint(grafika);
        g.drawImage(image, 0, 0, this);
        
    }

    @Override
    public void paint(Graphics g) {
        plansza.rysujPlansze(g);
        repaint();
    }

    @Override
    public void keyTyped(KeyEvent ke) {
        
    }

    @Override
    public void keyPressed(KeyEvent ke) {
   switch(ke.getKeyCode()){
       case 38:
           System.out.println("GORA");
           plansza.ruszaj(kierunki.GORA);
         repaint();
           break;
       case 37:
          System.out.println("LEWO");
           plansza.ruszaj(kierunki.LEWO);
           repaint();
           
           break;
       case 39:
           System.out.println("PRAWO");
           plansza.ruszaj(kierunki.PRAWO);
           repaint();
           break;
       case 40:
           System.out.println("DOL");
           plansza.ruszaj(kierunki.DOL);
          repaint();
           break;
      
           
   }
        
    }

Ktoś pomoże ?

0

Nie wgłębiam się, ale przede wszystkim nie wywołuj repaint() z metody paint(). Po drugie nie wiem po co ci przeciążanie update()

0

Po trzecie, nigdy nie wywołuj metody paint().
Po czwarte, czyszczeniem musisz się zająć sam, standardowo robi się to przez wywołanie paint z klasy bazowej.

super.paint(g);

A za taki kod:

case 38:

pójdziesz do piekła.

case KeyEvent.VK_RIGHT:
0

W komponencie lekkim Swingu wystarczy wywołać paintComponent(Graphics g), bo w skład met. paint() wchodzi jeszcze rysowanie ramki i "dzieci" czyli komponentów zawieranych.
Metoda update() jest wykorzystywana tylko w komponentach ciężkich, a wywoływana jest przez repaint(). Tutaj ci się nie przyda, a widzę, że chciałeś jej użyć do czyszczenia tła. W Swingu robi się to tak jak napisał bogdans.
Nie rozumiesz chyba jednej zasady i z tego wynika mrożące krew w żyłach wywołanie repaint() w met. paint() :D : jeżeli przekazujesz kontekst graficzny do jakiejś metody i na nim rysujesz to wynik pojawi się na ekranie, bo met. paint() tylko wskazuje na aktualny kontekst komponentu. Innymi słowy: met. paint() nie jest potrzebna do narysowania czegokolwiek, tylko kontekst graficzny.

0

Super, działa dzięki :) Pomogły rady bogdansa,temat do zamknięcia :)

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