- ベストアンサー
javaのKeyListenerとActionListenerの違いと処理の途中でキーイベントが働かなくなる原因について
- javaのKeyListenerとActionListenerは、インターフェースとして使われることが多いです。
- keyPressedメソッドとactionPerformedメソッドを実装している場合、actionPerformedメソッドが動くとkeyPressedメソッドが反応しなくなることがあります。
- 具体的な原因はコードを見ないと特定できませんが、処理の競合やイベントの優先順位の問題が考えられます。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
>actionPerformedメソッドを動かしてからだと、keyPressedが動かなくなる(キーを押しても反応しなくなる) 単純な想像ですが・・・。 KeyListenerは、どこに実装していますか? たとえば、Frameなどのウインドウに組み込んでいるのでしょうか。また、ActionListenerはボタンに組み込んでいる、ということじゃないでしょうか。 ボタンをクリックした後、フレームの何もない部分をクリックすると、再度キーイベントが認識されるようになりませんか。 最初に起動した段階では、キーを押すと(何もコンポーネントが選択されていないため)Frame自体にキーイベントが送られKeyListenerが機能する。ボタンをクリックすると、そのボタンが選択された状態になるために、キーイベントが(Frameではなく)ボタンに送られるようになるため、FrameのKeyListenerがキーイベントを受け取れなくなる、というようなことでは・・・と、まったくの想像ですが。
その他の回答 (1)
- choconamacream
- ベストアンサー率44% (152/338)
/** 左クリックと@キーを同時に連打すると、めちゃめちゃ早くなる。 ちょっとワロタ。 */ import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Suburi extends JFrame implements ActionListener,KeyListener{ private JLabel label; private JButton button; private Boolean boo; private int counter; public Suburi(){ super("Swing"); setDefaultCloseOperation(EXIT_ON_CLOSE); Container contentPane = getContentPane(); label = new JLabel("Suburi"); contentPane.add(label,BorderLayout.NORTH); button = new JButton("Racket"); contentPane.add(button,BorderLayout.SOUTH); button.addActionListener(this); button.addKeyListener(this); boo = false; counter = 0; setSize(500,500); // pack(); } static public void main(String ... mojiretsu){ Suburi suburi = new Suburi(); suburi.setVisible(true); } public void actionPerformed(ActionEvent ae){ if(ae.getSource().equals(button)){ if(boo == false){ label.setText(String.valueOf(counter++)); button.setText("Event Handler!"); boo = true; }else{ label.setText(String.valueOf(counter++)); button.setText("Event Handler!!"); boo = false; } } } public void keyPressed(KeyEvent ke){ if(ke.getKeyCode() == KeyEvent.VK_AT){ // @キー label.setText(String.valueOf(counter++)); button.setText("Event Handler!!!"); } } public void keyReleased(KeyEvent ke){} public void keyTyped(KeyEvent ke){} }
お礼
回答ありがとうございます。 KeyListenerはフレームに実装しています。大まかには下記のような感じです。 public class MainPanel extends JPanel implements KeyListener, ActionListener{ public MainPanel(){ addKeyListener(this); JButton button = new button(""); button.addActionListener(this); } } ボタンにActionListenerを実装して、パネル自体にKeyListenerを実装しています。ボタンをクリックする前は、キーリスナーが動くのですが、ボタンをクリックした後は全くキーを感知していないようなのです。 よろしくお願いします。