2008年4月16日 星期三

jpanel.requestFocus on mouseEntered

Java Swing元件中,無法敲字進入JPanel畫板,理由主要在畫板尚未取得鍵盤焦點。 一個視窗收到鍵盤事件要送給誰,是由處於鍵盤焦點之元件來決定。 這樣的鍵盤焦點一個視窗一次只能存在一個接收元件。 故想要畫板隨著滑鼠移入即可接收鍵盤事件,作法為 設定畫板監聽mouseEntered事件,一旦發現滑鼠移入, 立即利用jpanel.requestFocus()方法,設定畫板自己為鍵盤焦點。 範例如下。
  1.  
  2. /*
  3. KeyPanel.java
  4. Demo for receiving key events in a jpanel
  5. */
  6. import java.awt.*;
  7. import java.awt.event.*;
  8. import javax.swing.*;
  9.  
  10. public class KeyPanel extends JFrame
  11. {
  12. JPanel centerPanel; // 打算敲字之畫板
  13. JTextField txtField; // 顯示所敲字之文字盒
  14.  
  15. public KeyPanel()
  16. {
  17. centerPanel = new JPanel();
  18. centerPanel.setBackground(Color.pink);
  19. centerPanel.addKeyListener(new KeyAdapter()
  20. {
  21. public void keyTyped(KeyEvent ke)
  22. {
  23. char k = ke.getKeyChar();
  24.  
  25. txtField.setText("keyTyped=" + k); // 顯示接收鍵盤字元
  26. }
  27. });
  28.  
  29. centerPanel.addMouseListener(new MouseAdapter()
  30. {
  31. public void mouseEntered(MouseEvent me)
  32. {
  33. centerPanel.requestFocus(); // 滑鼠移入時自動取得鍵盤焦點
  34. }
  35. });
  36.  
  37. this.add(centerPanel, BorderLayout.CENTER);
  38.  
  39. txtField = new JTextField();
  40. this.add(txtField, BorderLayout.NORTH);
  41. }
  42.  
  43. public static void main(String args[]) // 主程式
  44. {
  45. KeyPanel df = new KeyPanel();
  46. df.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  47. df.setSize(600, 400);
  48. df.setVisible(true);
  49. }
  50. }

沒有留言: