2008年4月16日 星期三

jpanel.requestFocus on mouseEntered

Java Swing元件中,無法敲字進入JPanel畫板,理由主要在畫板尚未取得鍵盤焦點。 一個視窗收到鍵盤事件要送給誰,是由處於鍵盤焦點之元件來決定。 這樣的鍵盤焦點一個視窗一次只能存在一個接收元件。 故想要畫板隨著滑鼠移入即可接收鍵盤事件,作法為 設定畫板監聽mouseEntered事件,一旦發現滑鼠移入, 立即利用jpanel.requestFocus()方法,設定畫板自己為鍵盤焦點。 範例如下。

/*
  KeyPanel.java
  
    Demo for receiving key events in a jpanel
*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class KeyPanel extends JFrame
{
  JPanel centerPanel; // 打算敲字之畫板
  JTextField txtField; // 顯示所敲字之文字盒

  public KeyPanel()
  {
    centerPanel = new JPanel();
    centerPanel.setBackground(Color.pink);
    centerPanel.addKeyListener(new KeyAdapter()
    {
      public void keyTyped(KeyEvent ke)
      {
        char k = ke.getKeyChar();

        txtField.setText("keyTyped=" + k); // 顯示接收鍵盤字元
      }
    });

    centerPanel.addMouseListener(new MouseAdapter()
    {
      public void mouseEntered(MouseEvent me)
      {
        centerPanel.requestFocus(); // 滑鼠移入時自動取得鍵盤焦點
      }
    });

    this.add(centerPanel, BorderLayout.CENTER);

    txtField = new JTextField();
    this.add(txtField, BorderLayout.NORTH);
  }

  public static void main(String args[]) // 主程式
  {
    KeyPanel df = new KeyPanel();
    df.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    df.setSize(600, 400);
    df.setVisible(true);
  }
}

沒有留言: