Swingの勉強をしていてprocessKeyEventとaddkeylistenerを簡単にですが試してみました。使ってみた感想としてprocessKeyEventの方がenableEventsで簡単にキーイベントを受け付ける用に出来て楽に感じました。addkeylistenerの方はインターフェースの継承の関係で使わないイベントであってもメソッドを書かなければならず若干ソースが多くなってしまい今のところaddkeylistenerのメリットがわかりません。しかし便利なメソッドには何か落とし穴がある事が多い気がします。なのでこの二つのメソッドの違いについてご教授いただければ幸いです。
追記
回答ありがとうございます。回答に書かれてる事を理解するために入力したキーを真ん中のJLabelに表示するソースを書いて順番に実行してみました。
- 1.まず①の番号が付いたメソッドを試し、キーリスナーをJFrameに加えた後コンパイルして実行。
結果
JFrameにフォーカスが当たらないのか中央の文字が変更されない。
- 2.次に左側のJbuttonにキーリスナーを追加して試してみる。
結果
左側のJButtonをクリックしてフォーカスが当たってる状態のみ文字が変わった。
- 3.次に②のメソッドを試し、enableEventでキーイベントを有効にしたJButtonクラスをJPanelの左側にはめ込む
結果
先ほどと同じ結果
これらを踏まえてprocessKeyEventとaddkeylistenerを比較してみるとprocessKeyEventの場合キー入力を受け付ける部品を作るときenableEventsのアクセス修飾子の問題で部品を継承したクラスを作らなければならないのが大変に感じました。また、addkeylistenerの場合キー入力を受け付けたいコンポーネントにそのメソッドを書くだけで良く、キーリスナーも使い回しが効くので便利に感じました。回答者様の伝えたいこととズレてる気がしますが確かにaddkeylistenerのメリットを体感する事が出来たと思います。
import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JLabel; import javax.swing.JButton; import java.awt.Dimension; import java.awt.Color; import java.awt.Font; import java.awt.BorderLayout; import java.awt.event.KeyEvent; import java.awt.event.KeyAdapter; class FocusCheck extends JFrame { public static void main( String[] args ) { FocusCheck fc = new FocusCheck(); fc.setVisible( true ); } //文字を表示するJLabelを入れる private static JLabel centerJLabel; FocusCheck() { //JFrameの基本設定 super( "テスト" ); setSize( 600, 450 ); setLocationRelativeTo( null ); setDefaultCloseOperation( EXIT_ON_CLOSE ); ① addKeyListener( new KeyListenerToJFrame() ); ② enableEvents( java.awt.AWTEvent.KEY_EVENT_MASK ); //JPanelをJFrameに追加 JPanel jp = new JPanel( new BorderLayout() ); getContentPane().add( jp ); //左側のボタンをJPanelに追加 ① jp.add( new JButtonTest(), BorderLayout.WEST ); ② jp.add( putLeftJButton(), BorderLayout.EAST ); //右側のボタンをJPanelに追加 jp.add( putRightJButton(), BorderLayout.EAST ); //文字を表示するJLabelをJPanelに追加 centerJLabel = putJLabel(); jp.add( centerJLabel, BorderLayout.CENTER ); } //左側のJButtonを作成しそのインスタンスを返すメソッド public JButton putLeftJButton() { JButton jb = new JButton( "左ボタン" ); jb.setPreferredSize( new Dimension( 100, 75 ) ); //①の状態に更に次のメソッドを追加 ① jb.addKeyListener( new KeyListenerToJFrame() ); return jb; } //右側のJButtonを作成しそのインスタンスを返すメソッド public JButton putRightJButton() { JButton jb = new JButton( "右ボタン" ); jb.setPreferredSize( new Dimension( 100, 75 ) ); return jb; } //中央の文字を表示するJLabelを作成しそのインスタンスを返すメソッド public JLabel putJLabel() { JLabel jl = new JLabel( "文字を入力してください" ); Font f = new Font( Font.DIALOG_INPUT, Font.BOLD, 30 ); jl.setFont( f ); jl.setHorizontalAlignment( JLabel.CENTER ); return jl; } //JFrame用のキーリスナークラス class KeyListenerToJFrame extends KeyAdapter { KeyListenerToJFrame(){ System.out.println( "JFrame用のキーリスナークラスがインスタンスされました"); } public void keyPressed( KeyEvent e ) { System.out.println( "JFrameでキーを入力しました" ); centerJLabel.setText( String.valueOf( e.getKeyChar() ) ); } } //キー入力時に実行されるメソッド protected void processKeyEvent( KeyEvent e ){ System.out.println( "キーを入力しました" ); centerJLabel.setText( String.valueOf( e.getKeyChar() ) ); } //JButtonを継承しenableEventsでキーイベントの送信を有効にしたクラス class JButtonTest extends JButton { JButtonTest(){ super( "左ボタン" ); enableEvents( java.awt.AWTEvent.KEY_EVENT_MASK ); } protected void processKeyEvent( KeyEvent e ){ System.out.println( "JButtonTestでキーを入力しました" ); centerJLabel.setText( String.valueOf( e.getKeyChar() ) ); } } }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/13 06:36
2017/11/13 06:47 編集