Почему мой KeyListener ничего не делает? - PullRequest
2 голосов
/ 16 января 2012

Когда я пытаюсь нажать пробел, ничего не происходит. Я пробовал это с разными ключами, но ничего не работает. Может кто-нибудь сказать мне, что я делаю не так? или почему это не работает?

Также я использую Java SE 1.6 для компиляции.

Вот мой код:

package bigbass1997;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.*;

@SuppressWarnings("serial")
public class Main extends JFrame implements KeyListener, MouseListener, MouseMotionListener{

    // VARIABLES
    public static String title = "Royal Casino";
    public static String author = "bigbass1997";
    public static String version = "0.0.0";

    GamePanel gp;

    public Main(){
        gp = new GamePanel();
        this.setSize(GamePanel.gameDim);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
        this.setTitle(title + " " + version);
        this.setResizable(false);
        this.setLocationRelativeTo(null);
        this.addKeyListener(this);
        this.addMouseListener(this);
        this.addMouseMotionListener(this);
        this.add(gp);
    }

    @Override
    public void keyPressed(KeyEvent e) {
        int key = e.getKeyCode();
        if(key == KeyEvent.VK_SPACE){
            Slots.slotsThread.start();
            System.out.println("Slot THREAD Started"); 
            GamePanel.slotsplaying = true;
        }
    }

    public static void main(String[] args) {
        @SuppressWarnings("unused")
        Main m = new Main();
    }

    @Override
    public void keyReleased(KeyEvent e) {
        // TODO Auto-generated method stub

    }


    @Override
    public void keyTyped(KeyEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseDragged(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseMoved(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseClicked(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseEntered(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseExited(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mousePressed(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseReleased(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

}

Ответы [ 2 ]

5 голосов
/ 16 января 2012

Это проблема фокуса - KeyListeners работают, только если компонент, который прослушивается, имеет фокус. Вместо этого используйте привязки клавиш. Приличный учебник Key Bindings по этому вопросу можно найти в учебниках по Java Swing.

Например:

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.*;

@SuppressWarnings("serial")
public class BigBassMain extends JFrame {

    private static final String SPACE_BAR = "space bar";
   // VARIABLES
    public static String title = "Royal Casino";
    public static String author = "bigbass1997";
    public static String version = "0.0.0";

    GamePanel gp;

    public BigBassMain(){
        gp = new GamePanel();
        this.setSize(GamePanel.gameDim);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
        this.setTitle(title + " " + version);
        this.setResizable(false);
        this.setLocationRelativeTo(null);
        this.add(gp);

        ActionMap actionMap = gp.getActionMap();
        InputMap inputMap = gp.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);

        inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0), SPACE_BAR);
        actionMap.put(SPACE_BAR, new AbstractAction() {

         @Override
         public void actionPerformed(ActionEvent arg0) {
            Slots.slotsThread.start();
            System.out.println("Slot THREAD Started"); 
            GamePanel.slotsplaying = true;
         }
      });
    }

    public static void main(String[] args) {
        @SuppressWarnings("unused")
        BigBassMain m = new BigBassMain();
    }

}

Кроме того, вы действительно не хотите, чтобы ваши классы GUI реализовывали ваших слушателей, так как он просит один бедный маленький класс сделать слишком много. Вместо этого используйте анонимные внутренние классы для своих слушателей или отдельные классы.

0 голосов
/ 16 января 2012

Вы добавляете KeyListener к неправильному JComponent.Попробуйте это:

this.getGlassPane().addKeyListener(this);

Более подробную информацию о том, как работает библиотека Swing по этой проблеме, можно найти здесь: http://docs.oracle.com/javase/tutorial/uiswing/components/rootpane.html

...