не работает keylistener

229
28 ноября 2017, 21:59

Почему не реагирует на нажатие клавиш?

Я уже миллион статей перечитал, вроде всё нормально должно быть.
Да код не очень, но суть вопроса в KeyListener.

public Game() {
    setBackground(Color.BLUE);
    initgame();
    loadimage();
    addKeyListener(new FieldKeyListener());
    setFocusable(true);
    requestFocus();
}
public void initgame(){
    this.x=160;
    this.y=610;
    timer= new Timer(50, this);
    timer.start();
    createblock();
}
public void createblock(){
    blocks[currentblock]=new Random().nextInt(units);
    for(int i=0;i<blocks[currentblock];i++){
        groundplace[currentblock][i]=new Random().nextInt(units);
    }
    for (int i=1;i<units;i++){
       blockX[i]=i*16;
    }
}
public void loadimage(){
    ImageIcon imc = new ImageIcon("12.png");
    Mycar=imc.getImage();
    ImageIcon iec = new ImageIcon("12.png");
    Enemycar=iec.getImage();
}
@Override
protected void paintComponent(Graphics g) {
     super.paintComponent(g);
     g.drawImage(Mycar,x,y,this);
     for(int j=0;j<=currentblock;j++){
         for(int i=0;i<blocks[j];i++){
             g.drawImage(Enemycar, blockX[groundplace[j][i]], blockY[j], this);
         }
     }
}
@Override
public void actionPerformed(ActionEvent e) {
  move();
  for(int i=0;i<=currentblock;i++){
      blockY[i]+=DOT_SIZE/8;
  }
  if(t_n==0){
      t_n=System.currentTimeMillis();
      t_f=t_n+t_d;
  }
  if(t_f<=System.currentTimeMillis()){
      currentblock++;
      createblock();
      t_n=0;
  }
  if(blockY[2]==600){
      currentblock=0;
  }
  repaint();
}
 public void move(){
    if(left){
        x -= DOT_SIZE;
    }
    if(right){
        x += DOT_SIZE;
    } 
    if(up){
        y -= DOT_SIZE;
    } 
    if(down){
        y += DOT_SIZE;
    }
 }

class FieldKeyListener implements KeyListener{       
    @Override
    public void keyPressed(KeyEvent e) {
       // super.keyPressed(e);
        int key = e.getKeyCode();
        if(key == KeyEvent.VK_A){
          left=true;
        }
        if(key == KeyEvent.VK_RIGHT){
           right=true;
        }
        if(key == KeyEvent.VK_UP ){
            up=true;
        }
        if(key == KeyEvent.VK_DOWN){
            down=true;
        }
    }
    @Override
    public void keyTyped(KeyEvent e) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
    @Override
    public void keyReleased(KeyEvent e) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
}
Answer 1

Обычно проблема заключается в том, что фокус находится на другом элементе, и он первым перехватывает событие. Есть вариант сделать остальные элементы

setFocusable(False);

Если они получают фокус.

READ ALSO
Selenium(Java,Chrome), не нажимаются две клавиши одновременно (Ctrl+t, Ctrl+n)

Selenium(Java,Chrome), не нажимаются две клавиши одновременно (Ctrl+t, Ctrl+n)

Следующий код работаетТо есть, происходит действие аналогичное нажатию Ctrl+A

197
Ошибка при валидации маски ввода номера телефона

Ошибка при валидации маски ввода номера телефона

На сайте используется yii2, В форме для валидации номера телефона подключён плагин jquerymaskedinput

276
Плановное sticky menu

Плановное sticky menu

Подскажите, есть вот такой скриптНа высоте 700px от верха, меню становиться sticky

235