2016-01-22 2 views
0

Я тестирую свой keyListener в java.Почему мой java KeyListener не работает для моего ubuntu?

Моя система в Ubuntu 14.04. Я настраиваю панель в основном и запускаю прослушиватель клавиш. Я также настраиваю значение true и выполняю requestFocusInWindow.

Но когда я запускаю программу, println никогда не появляется в консоли. смущенный этим.

package key; 

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

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

public class Key extends JPanel{ 
public void action(){ 
    KeyListener k = new KeyListener(){ 
     @Override 
     public void keyPressed(KeyEvent k){ 
      System.out.println("key is pressed!"); 
     } 
     @Override 
     public void keyReleased(KeyEvent e){ 
      // TODO Auto-generated method stub 
     } 
     @Override 
     public void keyTyped(KeyEvent e){ 
      System.out.println("key is typed!"); 
     } 
    }; 
    this.addKeyListener(k); 
    this.setFocusable(true); 
    this.requestFocusInWindow(); 
} 
public static void main(String[] args){ 
    JFrame frame = new JFrame(); 
    frame.setSize(400,300); 
    JPanel panel = new JPanel(); 
    panel.setBackground(Color.BLUE); 
    frame.add(panel); 
    frame.setVisible(true); 

    Key k = new Key(); 
    k.action(); 
} 
} 
+0

Потому что вы с помощью 'KeyListener' , серьезно, эта вещь настолько темпераментна, проще просто использовать [Key Bindings API] (http: //docs.oracl e.com/javase/tutorial/uiswing/misc/keybinding.html), который решает проблемы, связанные с фокусом, и предлагает лучшее повторное использование кода и абстракцию – MadProgrammer

+0

Я также надеюсь, что 'Key' был фактически добавлен в кадр в какой-то момент И рамка была сделана видимой. – MadProgrammer

+1

Это обычная проблема с тем же решением для [пример] (http://stackoverflow.com/questions/16409352/keylistener-not-working/16409362#16409362), [exmaple] (http://stackoverflow.com/questions/21368475/keylistener-not-working-using-applet/21370349#21370349), [exmaple] (http://stackoverflow.com/questions/16028573/keylistener-is-not-working/16028698 # 16028698), [пример] (http://stackoverflow.com/questions/18029136/keylistener-not-working-requestfocus-not-fixing-it/18029321#18029321), [пример] (http: // stackoverflow .com/questions/27270284/keylistener-is-not-working-in-java/27270454 # 27270454) – MadProgrammer

ответ

2

любые советы по этому поводу?

  • Используйте key bindings API из KeyListener
  • Добавить k в frame прежде, чем это сделать видимыми

Например ...

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import java.awt.event.KeyEvent; 
import javax.swing.AbstractAction; 
import javax.swing.ActionMap; 
import javax.swing.InputMap; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.KeyStroke; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Key extends JPanel { 

    public void action() { 
     JLabel label = new JLabel("Waiting"); 
     InputMap inputMap = getInputMap(WHEN_IN_FOCUSED_WINDOW); 
     ActionMap actionMap = getActionMap(); 

     inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, 0, false), "press.a"); 
     actionMap.put("press.a", new AbstractAction() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       label.setText("Pressed A"); 
      } 
     }); 
     inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, 0, true), "release.a"); 
     actionMap.put("release.a", new AbstractAction() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       label.setText("Waiting"); 
      } 
     }); 

     add(label); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       JPanel panel = new JPanel(); 
       panel.setBackground(Color.BLUE); 
       frame.add(panel); 
       Key k = new Key(); 
       k.action(); 
       frame.add(k, BorderLayout.SOUTH); 
       frame.setSize(400, 300); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 
+0

Спасибо! он, наконец, работает на моем –