2012-12-29 64 views
3

我正在做一個涉及JPanel中的鼠標和鍵監聽器的小項目。不幸的是,當我使用鼠標/鍵盤時,沒有任何方法被調用。我以前曾使用過JPanels/JFrame/JApplet和JComponents。代碼片段如下所示:MouseListener/KeyListener不工作(JPanel)

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.event.*; 
import java.io.File; 
import java.io.PrintWriter; 
import java.io.IOException; 
import java.io.FileNotFoundException; 
import java.awt.image.BufferedImage; 
import javax.imageio.ImageIO; 
import java.util.Scanner; 

public class Hello extends JPanel implements KeyListener, MouseListener{ 
    JPanel panel = new JPanel(); 
    JFrame frame = new JFrame(); 
    public Hello(){ 
     addKeyListener(this); 
     addMouseListener(this); 
    } 
    public static void main(String [] args){ 
     Hello play = new Hello(); 
     play.setPanel(); 
    } 
    public void setPanel(){ 
     panel.setLayout(null); 
     frame.add(panel); 
     frame.setLayout(null); 
     panel.setBounds(0,0,100,100); 
     frame.setVisible(true); 
     panel.setVisible(true); 
     panel.setFocusable(true); 
     frame.setSize(100,100); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
    public void keyTyped(KeyEvent evt){ 
     System.out.println("keytyped"); 
    } 
    public void keyPressed(KeyEvent evt){ 
     System.out.print("keypressed"); 
    } 
    public void keyReleased(KeyEvent evt){ 
     System.out.println("keyreleased"); 
    } 
    public void mousePressed(MouseEvent evt){ 
     System.out.println("mousepressed"); 
    } 
    public void mouseReleased(MouseEvent evt){ 
     System.out.println("mousereleased"); 
    } 
    public void mouseClicked(MouseEvent evt){ 
     System.out.println("mouseclicked"); 
    } 
    public void mouseEntered(MouseEvent evt){ 
     System.out.println("mousenentered"); 
    } 
    public void mouseExited(MouseEvent evt){ 
     System.out.println("mouseexited"); 
    } 
} 

題外話:我不斷收到 您的帖子似乎包含格式不正確的代碼,代碼中的錯誤。請使用代碼工具欄按鈕或CTRL + K鍵盤快捷鍵將所有代碼縮進4個空格。要獲得更多編輯幫助,請單擊[?]工具欄圖標。 我不知道如何解決它。有時候我把所有的東西都放在代碼裏面,它仍然不會提交。

回答

10

看一看Java KeyListener for JFrame is being unresponsive?

您需要註冊爲要傾聽每一位JComponentKeyListenerMouseListener

public Hello() { 
    addKeyListener(this); 
    addMouseListener(this); 
    panel.addKeyListener(this); 
    panel.addMouseListener(this); 
    frame.addKeyListener(this); 
    frame.addMouseListener(this); 
} 

編輯:
鍵和鼠標事件僅由具有集中在當時的JComponent解僱。正因爲如此,KeyBindings似乎對KeyListeners有利。然而,這兩個人都有他們的申請,所以這裏沒有硬性規定。讀一讀'How to Write a Key Listener'和'How to Write a Key Binding',你就會明白了。

+0

謝謝。這是否也適用於JComponents?就像每個JLabel,JTextField等一樣?或者,如果我將它們添加到面板中,它們都可以工作嗎?將在5分鐘內投票。 – GoldenLyfe

+2

是的,唯一一個將會發射事件的'JComponent'是當時有'focus'的那個。 [如何編寫密鑰監聽器](http://docs.oracle.com/javase/tutorial/uiswing/events/keylistener.html)和[如何編寫密鑰綁定](http://docs.oracle.com /javase/tutorial/uiswing/misc/keybinding.html)打破兩者之間的差異;這是非常微妙的,但在寫代碼之前值得你去抓。 –

+0

@SeanConnolly請將你的回答作爲評論的一部分。應該避免使用KeyListeners(部分出於這個原因)支持KeyBindings – MadProgrammer

1

試試這個:

panel.addKeyListener(this); 
panel.addMouseListener(this); 

您必須將偵聽器添加到您要聽每一個組件。

+1

謝謝你的貢獻。給出一個解決方案是很好的,解釋它爲什麼工作更好(http://stackoverflow.com/questions/how-to-answer)。 – ARRG

2

更好地避免使用KeyListenersJPanel,使用KeyBindings來代替。 JPanel無法獲得焦點,因此無法與KeyEvents互動。使用KeyBindings,即使組件沒有焦點,也可以將Action映射到KeyStroke。

+0

amen .......................... – mKorbel