2010-05-13 55 views
4

我想在java中的面板上關注焦點時捕獲按鍵。我該怎麼辦?在java面板中捕獲按鍵

我正在使用Netbeans作爲IDE。我嘗試添加keyTyped事件,但它不工作。

這裏去我的代碼

import com.lanadmin.Interface.ClientInterface; 
import java.awt.Toolkit; 
import java.awt.event.InputEvent; 
import java.awt.event.MouseEvent; 
import java.rmi.Naming; 
import java.util.logging.Level; 


public class RemoteViewer extends javax.swing.JInternalFrame { 


    public RemoteViewer() { 
     initComponents(); 
     rdpanel.setFocusable(true); 
    } 


    @SuppressWarnings("unchecked") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code">       
    private void initComponents() { 

     rdpanel = new javax.swing.JPanel(); 
     setFocusable(true); 

     rdpanel.setToolTipText("Remote Desktop"); 
     rdpanel.addMouseListener(new java.awt.event.MouseAdapter() { 
      public void mouseClicked(java.awt.event.MouseEvent evt) { 
       rdpanelMouseClicked(evt); 
      } 
      public void mousePressed(java.awt.event.MouseEvent evt) { 
       rdpanelMousePressed(evt); 
      } 
      public void mouseReleased(java.awt.event.MouseEvent evt) { 
       rdpanelMouseReleased(evt); 
      } 
     }); 
     rdpanel.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { 
      public void mouseMoved(java.awt.event.MouseEvent evt) { 
       rdpanelMouseMoved(evt); 
      } 
     }); 
     rdpanel.addFocusListener(new java.awt.event.FocusAdapter() { 
      public void focusGained(java.awt.event.FocusEvent evt) { 
       rdpanelFocusGained(evt); 
      } 
     }); 
     rdpanel.addKeyListener(new java.awt.event.KeyAdapter() { 
      public void keyPressed(java.awt.event.KeyEvent evt) { 
       rdpanelKeyPressed(evt); 
      } 
      public void keyReleased(java.awt.event.KeyEvent evt) { 
       rdpanelKeyReleased(evt); 
      } 
      public void keyTyped(java.awt.event.KeyEvent evt) { 
       rdpanelKeyTyped(evt); 
      } 
     }); 

     javax.swing.GroupLayout rdpanelLayout = new javax.swing.GroupLayout(rdpanel); 
     rdpanel.setLayout(rdpanelLayout); 
     rdpanelLayout.setHorizontalGroup(
      rdpanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGap(0, 679, Short.MAX_VALUE) 
     ); 
     rdpanelLayout.setVerticalGroup(
      rdpanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGap(0, 626, Short.MAX_VALUE) 
     ); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addContainerGap() 
       .addComponent(rdpanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
       .addContainerGap()) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addContainerGap() 
       .addComponent(rdpanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
       .addContainerGap()) 
     ); 

     pack(); 
    }// </editor-fold>       
    private void rdpanelMouseMoved(java.awt.event.MouseEvent evt) {         
     double xScale = Toolkit.getDefaultToolkit().getScreenSize().getWidth()/rdpanel.getWidth(); 
     double yScale = Toolkit.getDefaultToolkit().getScreenSize().getHeight()/rdpanel.getHeight(); 
     try { 
      String current = Login.handler.currentClientAddress.getHostAddress(); 
      ClientInterface client = (ClientInterface) Naming.lookup("rmi://" + current + "/lan"); 
      client.mousemove((int) (evt.getX() * xScale), (int) (evt.getY() * yScale)); 
     } catch (Exception ex) { 
      Log2File.logger.log(Level.SEVERE, null, ex); 
      Log2File.fileHandler.flush(); 
     } 
    }         
    private void rdpanelKeyPressed(java.awt.event.KeyEvent evt) {         
     System.out.println("keypressed"); 
    }         
    private void rdpanelKeyTyped(java.awt.event.KeyEvent evt) {         
     System.out.println("aaa"); 
    }         
    private void rdpanelKeyReleased(java.awt.event.KeyEvent evt) {          
     System.out.println("keyreleased"); 
    }         
    private void rdpanelFocusGained(java.awt.event.FocusEvent evt) {          
     rdpanel.addKeyListener(new java.awt.event.KeyAdapter() { 
      @Override 
      public void keyPressed(java.awt.event.KeyEvent evt) { 
       rdpanelKeyPressed(evt); 
      } 
      @Override 
      public void keyReleased(java.awt.event.KeyEvent evt) { 
       rdpanelKeyReleased(evt); 
      } 
      @Override 
      public void keyTyped(java.awt.event.KeyEvent evt) { 
       rdpanelKeyTyped(evt); 
      } 
     }); 
    }         
    public javax.swing.JPanel rdpanel; 
} 
+2

我們可以看到一些代碼嗎? – Finbarr 2010-05-13 08:01:52

回答

2

您需要添加一個新的FocusListener和新的KeyListener到面板上。如果您只想在面板處於焦點時捕獲擊鍵,請獲取FocusListener的操作以添加KeyListener並將其刪除。

2

添加KeyListener到面板:

JPanel panel = new JPanel(); 
panel.addKeyListener(new KeyListener() { 

    public void keyTyped(KeyEvent e) { … } 

    public void keyReleased(KeyEvent e) { … } 

    public void keyPressed(KeyEvent e) { … } 
}); 

處理事件與相應的方法。

正如其他人剛纔提到的那樣,您必須設置panel.setFocusable(true);,自然,您應該將此組件添加到您的框架(或其他父組件)。

+2

我已經添加了關鍵偵聽器,它不起作用。 – rgksugan 2010-05-13 07:48:29

4

實際上,你想要的是一個KeyboardManager來安裝一個KeyEventPostProcessor,或者甚至是一個替代調度的各種組件。我在NB應用程序中遇到了與您相同的問題。

這裏是我以前的文章:(developer.com

我這樣做是爲了捕捉在面板中輸入任何控制鍵事件(發起「OK」自動按鈕的行爲):

KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager(); 
    manager.addKeyEventPostProcessor(new EnterKeyListener()); 

而且聽衆:

class EnterKeyListener implements KeyEventPostProcessor { 

    @Override 
    public boolean postProcessKeyEvent(KeyEvent e) { 
     if (e.getKeyCode() == KeyEvent.VK_ENTER) { 
      //Activate the refresh button: 
      fireSearch(); 
      return true; //halt further processing 
     } 
     return false; 
    } 
} 
+0

對於一個可能更簡單的解決方案,請參閱「氣墊船充滿鰻魚」回答關於默認鍵在這裏:http://stackoverflow.com/questions/19688849/focus-navigation-in-keybinding – jzd 2013-10-30 16:59:23