Ключевое событие не работает - Java

1

Я работаю над некоторыми учебными пособиями, но за последние несколько дней задерживался на keyEvents. Я уверен, что это связано с тем, как я реализую это, поскольку я даже не могу получить инструкцию печати.

Здесь мой тревожный фрагмент

static class Keyboard extends JPanel {

public Keyboard() {
   addKeyListener(new KeyAdapter() {

       public void keyPressed(KeyEvent e) {
            // TODO Auto-generated method stub
            System.out.println("pressed");
            switch (e.getKeyCode()) {
            case KeyEvent.VK_DOWN: 
                y += 10;break;
            case KeyEvent.VK_UP:
                y -= 10;break;
            case KeyEvent.VK_LEFT:
                x -= 10;break;
            case KeyEvent.VK_RIGHT:
                x += 10;break;
            }
            repaint();
        }
    });
}
}

и вот полный код. Это просто простая демонстрация, где вы можете перемещать и увеличивать круг с существующими кнопками.

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

public class ShapeTest1 extends JFrame {

   private JButton enlarge = new JButton("enlarge"); 
   private JButton up = new JButton("up"); 
   private JButton right = new JButton("right"); 
   private JButton down = new JButton("down"); 
   private JButton left = new JButton("left"); 
   BoardPanel bp;
   public ShapeTest1()
   {
  bp = new BoardPanel();

  // Create a separate panel and add all the buttons 
  JPanel panel = new JPanel();
  panel.add(enlarge); 
  panel.add(up); 
  panel.add(right); 
  panel.add(down); 
  panel.add(left); 

 // add Action listeners to all button events
 enlarge.addActionListener(bp);
  up.addActionListener(bp);
  down.addActionListener(bp);
  left.addActionListener(bp);
  right.addActionListener(bp);

 // add panels to frame
 add (bp, BorderLayout.CENTER);             
  add (panel,BorderLayout.SOUTH);
}      

public static void main(String args[]) throws Exception
{
   ShapeTest1 shape = new ShapeTest1();
   shape.setTitle("Draw Shape");
   shape.setSize(700,700);
   shape.setLocationRelativeTo(null);  // center the frame
   shape.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   shape.setVisible(true);
}
}

class BoardPanel extends JPanel implements ActionListener {

private Graphics gr;
protected static int x;
protected static int y;
protected int radius = 50;

public BoardPanel()
{
  x = 300;
  y = 300;
  radius = 50;

}

/* responds to various button clicked messages */ 
public void actionPerformed(ActionEvent e)
{
 if (e.getActionCommand().compareTo("enlarge") == 0)
    radius += 10;
 else if (e.getActionCommand().compareTo("left") == 0)
    x -= 10;
 else if (e.getActionCommand().compareTo("right") == 0)
    x += 10;
 else if (e.getActionCommand().compareTo("up") == 0)
    y -= 10;
 else if (e.getActionCommand().compareTo("down") == 0)
    y += 10;
  repaint();
}

static class Keyboard extends JPanel {

public Keyboard() {
   addKeyListener(new KeyAdapter() {

       public void keyPressed(KeyEvent e) {
            // TODO Auto-generated method stub
            System.out.println("pressed");
            switch (e.getKeyCode()) {
            case KeyEvent.VK_DOWN: 
                y += 10;break;
            case KeyEvent.VK_UP:
                y -= 10;break;
            case KeyEvent.VK_LEFT:
                x -= 10;break;
            case KeyEvent.VK_RIGHT:
                x += 10;break;
            }
            repaint();
        }
    });
}
}

/* Redraws the board and the pieces
 * Called initially and in response to repaint()
 */
protected void paintComponent(Graphics gr)
{
    super.paintComponent(gr);
    gr.fillOval(x-radius, y-radius, 2*radius, 2*radius);
}   
}

Любая помощь приветствуется.

  • 0
    «Чтобы инициировать события клавиатуры, компонент должен иметь фокус клавиатуры.» - Как написать ключевой слушатель
  • 0
    JPanel фокусируется по умолчанию, KeyListener будет реагировать на нажатия клавиш только тогда, когда компонент, на который они зарегистрированы, является фокусируемым и имеет фокус. Попробуйте вместо этого использовать API привязки клавиш
Показать ещё 6 комментариев
Теги:
swing
awt
keyevent
keylistener

1 ответ

1

Кажется, вы не вызываете new Keyboard() любом месте вашего кода, поэтому слушатель никогда не создается и не регистрируется. Из дизайна я бы предположил, что вы намереваетесь использовать эту панель с кнопками на ней, поэтому измените тип панели следующим образом:

// Create a separate panel and add all the buttons 
JPanel panel = new Keyboard();
  • 0
    Чтобы еще больше упростить это, есть ли способ сделать это без класса клавиатуры и просто заменив логику Action Event существующей логикой Key Event?
  • 0
    @ Эдвард, я не уверен в этом, боюсь, но я думаю, что codereview.stackexchange.com поможет вам в этом, как только вы заработаете , чтобы это работало к вашему удовольствию.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню