2012-01-16 5 views
2

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

Также я использую 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 

    } 

} 

ответ

5

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

Например:

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 реализации своих слушателей, как это спрашивает один бедный маленький класс, чтобы сделать слишком много. Вместо этого используйте анонимные внутренние классы для ваших слушателей или отдельных классов.

-4

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

this.getGlassPane().addKeyListener(this); 

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

+2

Как добавляет KeyListener к стеклянной панели собирается решить проблему Ора в? –

+2

-1, Где в вопросе даже предположить, что пользователь использует стеклянную панель? KeyEvents переходят к компоненту с фокусом. Стеклянное стекло даже не видно по умолчанию, поэтому оно не будет принимать ключевые события. Хорошо, что вы связались с учебником Swing, однако раздел, к которому вы должны были связать, относится к разделу «Как использовать привязки клавиш». Swing был разработан для использования ключевых привязок, а не для ключевых слушателей. – camickr

+0

«Где в вопросе, это даже предполагает, что пользователь использует стеклянную панель?» Базовые знания Swing говорят вам, что у каждого JFrame есть стеклянное стекло. Кроме того, добавление слушателей событий в стеклянную панель заставит их поймать входные события. Вот почему я ответил как таковой. – Flaise

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