Java : 最上位のウインドウで特定のキーアクションを処理する

  InputMap を使う方法



特定のコントロールを気にせずに JFrame 上のキーを取得します( this = JFrame を継承したクラス )

WHEN_IN_FOCUSED_WINDOW を使うのが重要で、他の定数では思い通りの
処理が実行されません。

  
AbstractAction esc_action = new AbstractAction() {
	public void actionPerformed(ActionEvent e) {
		System.out.println("ESCキーが押されました");
	}
};

InputMap imap = this.getRootPane().getInputMap(
	JComponent.WHEN_IN_FOCUSED_WINDOW
);
imap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "ESC");
this.getRootPane().getActionMap().put("ESC", esc_action);
  



  特定のキーでは無く、キーイベントを全て子から親にバブルさせる



ユーザコントロール内で、dispatchEvent を行い、親側で一手にイベントを処理します

※ InputMap と両方定義すると、このサンプルでは ESC は二度イベントが実行されます
※ バブル処理されていないユーザコントロール以外のコントロールでは何も処理されません

ユーザーコントロール
  
package myswing;

import javax.swing.JTextField;
import java.awt.event.*;
import java.awt.Component;

public class LboxText extends JTextField {

	private int _group = 0;

	public LboxText() {
		super();
		initialize();
	}

	private void initialize() {

		this.addKeyListener(new KeyAdapter() {   
		   public void keyPressed(KeyEvent e) {
		      LboxText.this.getParent().dispatchEvent( 
		         new KeyEvent(
		            (Component)(LboxText.this.getParent()),
		            e.getID(),
		            System.currentTimeMillis(),
		            e.getModifiers(),
		            e.getKeyCode(),
		            e.getKeyChar()
		         )
		      );
		   }
		});

	}

	public int getGroup() {

		return this._group;

	}

	public void setGroup(int arg) {

		this._group = arg;

	}

}
  

親側の JPanel(jContentPane)
  
jContentPane.setFocusable(true); 
jContentPane.addKeyListener(new java.awt.event.KeyAdapter() {   
	public void keyPressed(java.awt.event.KeyEvent e) {
		System.out.println(e.getKeyCode());
	}
});
  










  infoboard   管理者用   
このエントリーをはてなブックマークに追加





フリーフォントWEBサービス
SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ