JPanel rysowanie, obsługa zdarzeń klawiatury

0

Hej, chcę napisać prostą aplikację, żeby poćwiczyć zdarzenia klawiatury i rysowanie po JPanelu. Aplikacja ma wyświetlić kółko i przesuwać je za pomocą klawiszy WSAD.

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package cos;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

/**
 *
 * @author Mati
 */
public class Cos extends JFrame {

    /**
     * @param args the command line arguments
     */
     public Cos(){
            
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       
     ImagePanel ob = new ImagePanel();
     add(ob);
     setSize(300, 300);
        setVisible(true);
        
    }
    
   public static void main(String[] args) {
       Cos ob= new Cos();
       
    }
}
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package cos;

import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;

/**
 *
 * @author Mati
 */
class ImagePanel extends JPanel implements KeyListener{
    
    BufferedImage image;
    int x=0,y=0,width=10,height=10;
    
    public ImagePanel(){
         addKeyListener(this);
    }
    
   public void paintComponent(Graphics g){
      
       g.fillOval(x, y, width, height);
       
       
       
   }

    @Override
    public void keyTyped(KeyEvent e) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void keyPressed(KeyEvent e) {
         
      char z = e.getKeyChar();

      if (z=='w') y++;
      if (z=='s') y--;
      if (z=='a') x--;
      if (z=='d') x++;
      repaint();
    }

    @Override
    public void keyReleased(KeyEvent e) {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}

Kółko się wyświetla, ale nie porusza. Czy ktoś mi może powiedzieć dlaczego?

0

Chciałbym ci pomóc ale tak dawno nic nie rysowałem w javie że już nie pamiętam jak to się robi.
Ogólnie to musisz uruchamiać wątek przy naciśnięciu key'a i zatrzymywać go onKeyReleased() i wtedy inkrementować zmienną - ale nie jestem pewien.

0
    public ImagePanel(){
        setFocusable(true); //tego wiersza brakowało, panel nigdy nie miał fokusu (nie odbierał zdarzeń klawiaturowych)
        addKeyListener(this);
    }
   public void paintComponent(Graphics g){
       super.paintComponent(g); //tego brakowało, poprzednio narysowane kółko nie było mazane
       g.fillOval(x, y, width, height);
   }
  1. Myślę, że 'w' ma przesuwać w górę, a 's' w dół, u Ciebie było odwrotnie (zwiększenie y to przesunięcie w dół)
    public void keyPressed(KeyEvent e) {
 
      char z = e.getKeyChar();
      if (z=='w') y--;
      if (z=='s') y++;
      if (z=='a') x--;
      if (z=='d') x++;
      repaint();
    }
  1. Po co Ci taka dziwna obsługa zdarzeń keyTyped i keyReleased (rzucanie nieobsługiwanych wyjątków)? Wystarczy tak:
    public void keyTyped(KeyEvent e) {
    }
    public void keyReleased(KeyEvent e) {
    }
0

Dzięki wielkie!!! Tnie się strasznie, przeczytałem, że trzeba zastosować podwójne buforowanie. Jakbym miał z tym problem, odezwę się.

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