2013-04-26 52 views
1

我一直在阅读java文档,并试图理解关键侦听器及其用法。我设法做出一个简单的程序,其中'w'和's'切换背景颜色,但是当我试图让他们移动一个彩球时,他们停止了响应。我相当肯定这不是一个绘画问题,因为我通读了JavaDocs常见的绘画问题。我已经将JFrame设置为可调整的(或者至少我认为我有)。如果有人能指出我在正确的方向,将不胜感激。添加到JFrame时KeyListeners没有响应

这里是主类

import javax.swing.JFrame; 
import java.awt.EventQueue; 

public class frame { 

    public static void main(String[] args){ 

     EventQueue.invokeLater(new Runnable() 
     {     
      @Override 
      public void run() 
      {  
       showGui();             
      } 
     });   
    } 

    public static void showGui(){ 
     JFrame f = new JFrame("Testing.."); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      f.setFocusable(true); 
      f.add(new Gui()); 
      f.setSize(300,300); 
      f.setVisible(true);    
    } 
} 

和GUI/KeyListener的类

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import javax.swing.BorderFactory; 
import javax.swing.JPanel; 

@SuppressWarnings("serial") 
public class Gui extends JPanel { 

    public Gui(){ 
     HandlerClass handle = new HandlerClass(); 
     setBorder(BorderFactory.createLineBorder(Color.black)); 
     addKeyListener(handle); 
    } 

    int x = 30; 
    int y = 30; 

    public void paintComponent(Graphics g){ 
     super.paintComponents(g); 
     g.setColor(Color.BLUE); 
     g.fillRect(x, y, 20, 20); 


    } 

    private class HandlerClass implements KeyListener{ 

     public void keyTyped(KeyEvent e) { 
      switch (e.getKeyChar()){ 
      case 'w': 
      repaint(x,y+1, 20,20); 
       break; 
      case 's': 
       repaint(x,y-1, 20,20); 
       System.out.println("testing if this fires"); 
      break; 
      }    
     } 

     public void keyPressed(KeyEvent e) { 
      //todo 
     } 
     public void keyReleased(KeyEvent e) { 
      //todo 

     } 

    } 

} 

在正确的方向的任何勾缝将是非常有益的,谢谢。

回答

2

KeyListener将只对关键事件作出响应时,它连接到该组件是可聚焦并具有焦点。

JPanel默认情况下不符合这些要求中的任何一个(默认情况下,它不是可调焦的)。

出于这些原因,不建议您使用KeyListener,而是使用Key Bindings,它必须克服这些问题

+0

双Jinks和1 +重拳! – 2013-04-26 01:49:39

+0

谢谢。这正是我正在寻找的答案。我不确定这是否是我的明显疏忽,或者是否需要彻底改变我对问题的看法。 – Apcragg 2013-04-26 01:51:23

2

如果你已经搜索过这个网站,你就会知道这个解决方案:不要使用KeyListeners,而要使用Key Bindings。如果你还没有搜索过这个网站,那么在提问之前你应该做到这一点。

例如为:a previous answer of mine with example code

+0

+1 Jinks ...... – MadProgrammer 2013-04-26 01:49:15

+1

所以我咬紧牙关,学会了如何使用它们,我现在才开始工作。感谢您通过KeyListeners使用它们的见解! – Apcragg 2013-04-26 03:14:14

0
repaint(x,y+1, 20,20); 

要绘制y稍高的能力,但你实际上并没有改变y。尝试:

repaint(x,++y, 20,20); 

对于其他听众也是如此(在另一个方向上)。

+0

谢谢你指出,这不是我想要解决的问题,但它是一个问题,非常感谢! – Apcragg 2013-04-26 01:53:02