2014-11-05 2 views
0

Я пытаюсь попасть в графическое программирование на Java и пробую небольшое упражнение, когда хочу сделать автомобиль взад и вперед по кадру. Затем я хочу сделать это быстрее или медленнее, если я нажимаю клавиши со стрелками вверх или вниз. Тем не менее, я не могу правильно добавить ключевого слушателя. Чтобы проверить мой код, я просто пытаюсь распечатать сообщение в командной строке. Любая помощь будет оценена!Java: добавление ключевого прослушивателя в JFrame

Код компилируется и запускается как есть. Я получаю автомобиль взад и вперед в кадре. Главное, что не работает, - это прослушиватель клавиш.

import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*; 

public class Racing extends JFrame 
{ 
    public static class Car extends JComponent implements ActionListener 
    { 
     int x=0; 
     int y=0; 
     int delta = 10; 
     Timer timer; 
     int z = 300; 

     public Car() 
     { 
      timer = new Timer(20,this); 
      timer.start(); 

      addKeyListener(new KeyAdapter() 
      { 
       @Override 
       public void keyPressed(KeyEvent e) 
       {   
        if(e.getKeyCode() == KeyEvent.VK_UP) 
         System.out.println("The up key was pressed!"); 
       } 
      }); 
     } 

     public void paint(Graphics g) 
     { 
      super.paintComponent(g); 

      y = getHeight(); 
      z = getWidth(); 

      g.setColor(Color.BLUE); 
      g.fillRect(0, 0, z, y); 

      Polygon polygon = new Polygon(); 
      polygon.addPoint(x + 10, y - 20); 
      polygon.addPoint(x + 20, y - 30); 
      polygon.addPoint(x + 30, y - 30); 
      polygon.addPoint(x + 40, y - 20); 

      g.setColor(Color.BLACK); 
      g.fillOval(x + 10, y - 11, 10, 10); 
      g.fillOval(x + 30, y - 11, 10, 10); 
      g.setColor(Color.GREEN); 
      g.fillRect(x, y - 21, 50, 10); 
      g.setColor(Color.RED); 
      g.fillPolygon(polygon); 
      g.setColor(Color.BLUE); 
     } 

    public void actionPerformed(ActionEvent e) { 
     x += delta; 
     if (x > z-40) { 
      delta *= -1; 
      x = (z-40); 
     } else if (x < 0) { 
      delta *= -1; 
      x = 0; 
     } 

     repaint(); 
    } 

    } 

    public static void main(String[] args) 
    { 
     JFrame frame = new JFrame("Racing"); 
     frame.setPreferredSize(new Dimension(600,300)); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.add(new Car()); 
     frame.setVisible(true); 
     frame.setFocusable(true); 
    } 
} 

ответ

3

Короткий ответ: нет, слишком много проблем.

Вместо этого используйте API привязки ключей. См How to Use Key Bindings для более подробной информации

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Polygon; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent; 
import javax.swing.AbstractAction; 
import javax.swing.ActionMap; 
import javax.swing.InputMap; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.KeyStroke; 
import javax.swing.Timer; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Racing extends JFrame { 

    public static class Car extends JComponent implements ActionListener { 

     int x = 0; 
     int y = 0; 
     int delta = 10; 
     Timer timer; 
     int z = 300; 

     public Car() { 
      timer = new Timer(20, this); 
      timer.start(); 

      InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW); 
      im.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "goingUp"); 

      ActionMap am = getActionMap(); 
      am.put("goingUp", new AbstractAction() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        System.out.println("The up key was pressed!"); 
       } 
      }); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 

      y = getHeight(); 
      z = getWidth(); 

      g.setColor(Color.BLUE); 
      g.fillRect(0, 0, z, y); 

      Polygon polygon = new Polygon(); 
      polygon.addPoint(x + 10, y - 20); 
      polygon.addPoint(x + 20, y - 30); 
      polygon.addPoint(x + 30, y - 30); 
      polygon.addPoint(x + 40, y - 20); 

      g.setColor(Color.BLACK); 
      g.fillOval(x + 10, y - 11, 10, 10); 
      g.fillOval(x + 30, y - 11, 10, 10); 
      g.setColor(Color.GREEN); 
      g.fillRect(x, y - 21, 50, 10); 
      g.setColor(Color.RED); 
      g.fillPolygon(polygon); 
      g.setColor(Color.BLUE); 
     } 

     public void actionPerformed(ActionEvent e) { 
      x += delta; 
      if (x > z - 40) { 
       delta *= -1; 
       x = (z - 40); 
      } else if (x < 0) { 
       delta *= -1; 
       x = 0; 
      } 

      repaint(); 
     } 

    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Racing"); 
       frame.setPreferredSize(new Dimension(600, 300)); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.pack(); 
       frame.add(new Car()); 
       frame.setVisible(true); 
       frame.setFocusable(true); 
      } 
     }); 
    } 
} 

Кроме того, не называйте super.paintComponent от paint, вы в основном сломали всю краску цепь. Вместо этого переопределите метод paintComponent ...

+0

Спасибо! Это было то направление, которое я пытался продумать. Я купил книгу программирования Java с некоторой графической информацией в ней, но это указывало на меня в другом направлении для этого конкретного аспекта. Каковы последствия разрыва цепи красок? –

+0

Вы можете в конечном итоге со странными артефактами живописи или вообще не нарисованными – MadProgrammer

Смежные вопросы