2015-04-23 4 views
0

Пожалуйста, помогите мне, ребята. Я просто не могу запустить KeyListener. Но я добавил все, что вам нужно (я думаю). Я действительно не знаю, что не так с этим кодом. Я добавил Key Listener, реализовал прослушиватель клавиш и включил все классы, чтобы что я забыл? :/My KeyListener не работает

import java.awt.Button; 
import java.awt.CardLayout; 
import java.awt.Color; 
import java.awt.FlowLayout; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.GridLayout; 
import java.awt.Rectangle; 

/******Key classes are included*********/ 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.io.IOException; 

import javax.swing.JButton; 
import javax.swing.JPanel; 
import javax.swing.Timer; 

/********Key listener is Implemented********/ 
public class Game extends JPanel implements KeyListener,Runnable 
{ 

    JPanel m_mainPanel; 
    Thread moveBall = new Thread(); 
    Timer t = new Timer(5, this); 

    int radius = 50; 

    int posx = 400; 
    int posy = 400; 

    int RectPosX = 10; 
    int RectPosY = 400; 

    int velocityX = 0; 
    int velocityY = 0; 

    //Konstruktor 
    public Game(JPanel mainPanel) { 
     m_mainPanel = mainPanel; 
     setLayout(new GridLayout(3, 1)); 

     JPanel north_panel = new JPanel(); 
     north_panel.setLayout(new FlowLayout(FlowLayout.LEFT)); 

     /**********I didn't forget this********/ 
     this.addKeyListener(this); 


     /*******Focus is set**********/ 
     setFocusable(true); 
     setFocusTraversalKeysEnabled(false); 

     add(north_panel); 

    } 

    //Painting rectangle 
    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 
     g.setColor(Color.BLACK); 
     g.fillRect(RectPosX, RectPosY, radius, radius); 
    } 



    //the key event wich isn't called 
    @Override 
    public void keyPressed(KeyEvent e) 
    { 
     System.out.println("Key pressed"); 

     if(e.getKeyCode() == KeyEvent.VK_UP) 
     { 
      velocityY = 10; 
     } 

     if(e.getKeyCode() == KeyEvent.VK_DOWN) 
     { 
      velocityY = -10; 
     } 
    } 

    @Override 
    public void keyTyped(KeyEvent e) { 

    } 

    @Override 
    public void keyReleased(KeyEvent e) { 

    } 

    @Override 
    public void run() 
    { 
     while(true) 
     { 
      repaint(); 
     } 
    } 
} 
+1

В чем фокус? Готов поспорить, 5 долларов это JFrame вместо JPanel. Либо добавьте KeyListener в JFrame, либо сосредоточьтесь на JPanel. –

+0

Как изменить фокус? edit: В JFrame не установлен KeyListener –

+0

Google - ваш друг, но requestFocusInWindow() - хорошее место для начала. –

ответ

0

Вот небольшой пример MCVE:

import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 



public class Main extends JPanel{ 


    public Main(){ 
     addKeyListener(new KeyListener(){ 

      @Override 
      public void keyTyped(KeyEvent e) { 
       System.out.println("Typed: " + e.getKeyChar()); 
      } 

      @Override 
      public void keyPressed(KeyEvent e) { 
       System.out.println("Pressed: " + e.getKeyChar()); 
      } 

      @Override 
      public void keyReleased(KeyEvent e) { 
       System.out.println("Released: " + e.getKeyChar()); 
      } 

     }); 
    } 

    public static void main(String[] args){ 
     JFrame frame = new JFrame("test"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new Main()); 
     frame.setSize(300, 300); 
     frame.setVisible(true); 
    } 
} 

Эта программа имеет ту же проблему у вас возникли: ключ слушатель никогда не вызывается! Это связано с тем, что фокус находится на JFrame, а не на JPanel.

Чтобы изменить это, вы должны сделать JPanel focusable. Вы делаете это, просто называя метод setFocusable(). Теперь ваши JPanel будет иметь фокус:

import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 



public class Main extends JPanel{ 


    public Main(){ 
     addKeyListener(new KeyListener(){ 

      @Override 
      public void keyTyped(KeyEvent e) { 
       System.out.println("Typed: " + e.getKeyChar()); 
      } 

      @Override 
      public void keyPressed(KeyEvent e) { 
       System.out.println("Pressed: " + e.getKeyChar()); 
      } 

      @Override 
      public void keyReleased(KeyEvent e) { 
       System.out.println("Released: " + e.getKeyChar()); 
      } 

     }); 

     setFocusable(true); 
    } 

    public static void main(String[] args){ 
     JFrame frame = new JFrame("test"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new Main()); 
     frame.setSize(300, 300); 
     frame.setVisible(true); 
    } 
} 

Более сложные программы могут потребовать от функции requestFocusInWindow(). Или вы, возможно, захотите изучить использование KeyBindings. Но ваша основная проблема вызвана проблемами фокуса.

+0

У меня уже есть набор фокусируемых реализованных в конструкторе: –

+0

@The_javascript_King Пожалуйста, опубликуйте [MCVE] (http://stackoverflow.com/help/mcve). –

+0

Есть MCVE: Класс игры: http://pastebin.com/bPFsjVC Класс меню; http://pastebin.com/CjUFPHVw Пункт меню Класс: http://pastebin.com/XZkumNgB Кнопки меню Класс: http://pastebin.com/Zx1Y86gm –

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