2016-12-23 11 views
-1

Я совершенно новый в программировании Java. Я не могу получить свои keyEvent с неработающей работой. Мне нужно это для маленькой игры, которую я делаю. Вот мой код:Как заставить keyEvent работать на Java?

package markusrytter.pingpong; 

import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class main extends JPanel implements KeyListener { 

    static int ballX; 
    static int ballY; 
    static int ballR = 15; 

    @Override 
    public void paint(Graphics g) { 
     super.paint(g); 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
     g2d.fillOval(ballX - ballR, ballY - ballR, ballR * 2, ballR * 2); 
    } 
    public static void main(String[] args) throws InterruptedException { 
     JFrame frame = new JFrame("Sample Frame"); 
     main game = new main(); 
     frame.add(game); 
     frame.setSize(1400, 800); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocationRelativeTo(null); 

     ballX = frame.getContentPane().getSize().width/2; 
     ballY = frame.getContentPane().getSize().height/2; 

     while (true) { 
      game.repaint(); 
      Thread.sleep(10); 
     } 
    } 

    public void keyPressed(KeyEvent e) { 
     System.out.println("A key is Pressed: " + e.getKeyCode()); 
     if(e.getKeyCode() == KeyEvent.VK_SPACE){ 
      System.out.println("Spacebutton pressed"); 
     } 
    } 
} 

Я надеюсь, кто-то может помочь, я пытался смотреть видео, но опять же, я новичок в Java.

+1

(1-) не уверен, почему у этого так много голосов. OP утверждает, что они читают статьи и копируют код напрямую. Разве вы не думаете, что код должен работать, если он был скопирован напрямую? – camickr

ответ

0

Самое главное: измените название своего класса. Это называется основной, и это плохая идея. Также более целесообразно переопределить paintComponent() вместо paint.

Вы не добавили keylistener в JFrame. Вы должны назвать это в главном после создания game:

frame.addKeyListener(game); 

Кроме того, необходимо добавить оставшиеся KeyListener методы.

и это должно быть сделано.

+0

Тогда он говорит: не может использовать это в статической ссылке –

+0

@markusrytter замечает мое редактирование. (изменено 'this' на' game') – ItamarG3

+0

Большое спасибо, теперь это работает –

4
  1. Ваш код не будет компилироваться, так как вы не выполнили KeyListener (полностью)

  2. Вы не добавили ключ слушателя к панели в конструктор.

  3. KeyEvents отправляются только на компоненты с фокусом. Ваша панель не фокусируется, поэтому она никогда не получит событий. Вы используете метод setFocusable(true).

  4. Не переопределяйте краску(). Вместо этого вы должны переопределить paintComponent(...).

  5. Вы даже не должны использовать KeyListener. Вместо этого при использовании Swing вы должны использовать Key Bindings.

  6. Не используйте статические переменные для свойств вашего класса.

  7. Ваш GUI не создан на Event Dispatch Thread (EDT).

я прочитал статьи, я смотрел видео, и сделал все в точности, как они,

Очевидно, что нет, или он будет работать.

Для правильного обучения начинайте с Swing Tutorial. Есть разделы, посвященные:

  1. Как написать KeyListener
  2. заказ Картина
  3. привязок ключей.
  4. Конкуренция