2013-12-01 2 views
0
package Objects; 

import javax.swing.JPanel; 
import javax.swing.Timer; 
import java.awt.*; 
import java.awt.event.*; 
import java.awt.geom.*; 



public class PowerBar extends JPanel implements ActionListener, KeyListener { 

private double x; 
private final double y = 420; 
private double xv = 0; 
private final int width, height; 
private boolean left = false, right = false; 
private Timer t = new Timer(5, this); 

public PowerBar(JPanel j) { 
    width = j.getWidth(); 
    height = j.getHeight(); 
    x = 180; 

    t.start(); 
    this.addKeyListener(this); 
    setFocusable(true); 
    setFocusTraversalKeysEnabled(false); 

    } 

    public void move() { 

    } 

    public void powerbarPosition() { 

    } 

    @Override 
    public void paintComponent(Graphics g) { 
    Graphics2D g2 = (Graphics2D) g; 
    Rectangle2D rect = new Rectangle2D.Double(x, y, 100, 15); 
    g2.setColor(Color.DARK_GRAY); 
    g2.fill(rect); 
    } 

    @Override 
    public void actionPerformed(ActionEvent ae) { 
    x += xv; 
    repaint(); 
    } 

    @Override 
    public void keyPressed(KeyEvent ev) { 
    if (ev.getKeyCode() == KeyEvent.VK_LEFT) { 
     left = !left; 
     if (left == true) { 
      xv = -2; 
     } else if (ev.getKeyCode() == KeyEvent.VK_RIGHT) { 
      right = !right; 
      if (right == true) { 
       xv = 2; 
      } 
     } 
     } 
    } 

    @Override 
    public void keyReleased(KeyEvent ev) { 

    } 

    @Override 
    public void keyTyped(KeyEvent ke) { 

    } 

    } 

Im kinda new для программирования, и это моя первая игра для программирования. Я пытаюсь заставить панель питания двигаться с левой и правой клавишей, но при нажатии клавиши не реагирует на эти клавиши. Панель питания рисуется в отдельном классе DrawMain, который использует метод paintComponent.ActionListener и KeyListener вообще не работают

+0

1) Для лучшей помощи рано, опубликовать [SSCCE] (http://sscce.org/). 2) Для Swing обычно используют привязки клавиш по сравнению с AWT на нижнем уровне, 'KeyListener'. Подробнее о том, как их использовать, см. [Как использовать привязки клавиш] (http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html). –

ответ

4
  1. JPanel не слушает Action, он представляет собой контейнер, а не контроллер. Следовательно, он не имеет функции addActionListener(actionListener).
  2. Для прослушивания нажатия клавиш, отпускания и т. Д. Целевой компонент должен иметь фокус. Однако вы можете вызвать requestFocusInWindow() на целевом компоненте, чтобы получить фокус, если хотите.
  3. Не рекомендуется внедрять слушателя в класс, который не прослушивает такой прослушиватель, в вашем контексте это ActionListener. Использовать встроенный анонимный класс или объявить другой класс, реализующий ActionListener
  4. Поскольку @AndrewThompson и другие качели концертов stackoverflow будут предлагать, предпочтительнее использовать привязку клавиш с использованием карты ввода ключа и карты ввода действий для компонента, который является более высоким уровнем реализация. Старайтесь избегать использования максимально возможного уровня AWT KeyListener.

Проверьте официальная страница учебника:

  1. How to use Key Bingings
  2. How to Write a Key Listener
  3. How to Write an Action Listener
+0

Стоп, остановка ..! Вы заставляете меня хотеть снова проголосовать за это. *;) –

+0

ahh, я просто хотел дать вам кредит, поскольку я забыл упомянуть об этом в своем ответе :) – Sage

3

1) Ваш ActionListener не прилагается к JPanel и компонентов на ней, из-за что он не работает.

2) Не используйте KeyListener вместо использования Key Bindings:

getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT,0), "doSomething1"); 
getActionMap().put("doSomething1", new AbstractAction() { 

    @Override 
    public void actionPerformed(ActionEvent arg0) { 
     left = !left; 
     if (left == true) { 
      xv = -2; 
     } 
    } 
}); 

getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT,0), "doSomething2"); 
getActionMap().put("doSomething2", new AbstractAction() { 

    @Override 
    public void actionPerformed(ActionEvent arg0) { 
      right = !right; 
      if (right == true) { 
       xv = 2; 
      } 
    } 
}); 
+0

«ActionListener» прикреплен к таймеру Swing' экземпляр – Robin

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