1

2 つのフレームがあります (1 つのメインと 1 つのポップアップ)。メイン フレームにキーとマウスのリスナーが追加されます。どちらも問題なく動作します。ポップアップには 50 個のボタンがあります。それらすべてに対して 1 つのアクション リスナーがあります。それは正常に動作します。キーとマウスのリスナーもあります。マウスは動作します。キーが不安定です。メイン フレームで使用されるのと同じ keyListener クラスがポップアップ フレームにも追加されます。ポップアップが表示されるとすぐに、キー リスナーが動作し、マウス クリックが発生すると (アクション リスナーが起動すると)、キー リスナーが動作しなくなります。助けてください。添付のコードは簡易版です


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

public class key {
    private static  class toolsAction implements ActionListener {
        public void actionPerformed (ActionEvent ae) {
            log("Command " + Integer.parseInt(ae.getActionCommand()));
        }
    }
    private static void log(String s) { System.out.println(s); }
    private static class keyboardHandler implements KeyListener {
        public void keyPressed( KeyEvent e) { log("KB Press called ");   }
        public void keyReleased(KeyEvent e) { log("KB Release called "); }
        public void keyTyped   (KeyEvent e) { log("KB Typed called ");   }
    }
    public static void main(String [] args) {
        JFrame pFrame = new JFrame("Frame");
        pFrame.addKeyListener(new keyboardHandler());
        Container pane = pFrame.getContentPane();
        pane.setLayout(null);
        pane.setVisible(true);
        pFrame.setSize(650, 300);
        pFrame.setVisible(true);
        JButton[] buttons = new JButton[50];
        toolsAction action = new toolsAction();
        for (int i = 0; i < 50; i++) {
            buttons[i] = new JButton("" + i);
            buttons[i].setActionCommand("" + i);
            buttons[i].addActionListener(action);
            pane.add(buttons[i]);
            buttons[i].setBounds(((i % 10) * 60), ((i / 10) * 40), 60, 40);
        }
    }
}
4

3 に答える 3

4

別のアプローチではAction、 とキー バインディングを使用します。以下の例では、10 個のボタンを数字キーにバインドし、数字MNEMONIC_KEYをそれぞれの として使用しています。

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

/** @see http://stackoverflow.com/a/14182227/230513 */
public class Key {

    public static final int SIZE = 10;

    private static class ToolAction extends AbstractAction {

        public ToolAction(int i) {
            super(String.valueOf(i));
            putValue(MNEMONIC_KEY, KeyEvent.VK_0 + i);
        }

        @Override
        public void actionPerformed(ActionEvent ae) {
            System.out.println(ae.getActionCommand());
        }
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                JFrame f = new JFrame("Frame");
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setLayout(new GridLayout(0, SIZE / 2));
                for (int i = 0; i < SIZE; i++) {
                    final ToolAction toolAction = new ToolAction(i);
                    JButton b = new JButton(toolAction);
                    String name = b.getText();
                    b.getInputMap(JButton.WHEN_IN_FOCUSED_WINDOW).put(
                        KeyStroke.getKeyStroke(KeyEvent.VK_0 + i, 0), name);
                    b.getActionMap().put(name, toolAction);
                    f.add(b);
                }
                f.pack();
                f.setVisible(true);
            }
        });
    }
}
于 2013-01-06T12:42:29.707 に答える
2

KeyListener、リスナーが追加されたコンポーネントが(キーボード)フォーカスを持っている場合にのみ実行されます。別のコンポーネントをクリックすると、そのコンポーネントがフォーカスになり、キーボードイベントがそのコンポーネントに送信されますKeyListener
ポップアップのコードを見ずにそれが問題であるかどうかはわかりませんが、投稿されたコードの問題です...


に追加しAWTEventListenerToolkit、フォーカスされたコンポーネントとは関係なくすべてのイベントをインターセプトできます。

private static class AWTListener implements AWTEventListener {
    @Override
    public void eventDispatched(AWTEvent event) {
        log("AWT: " + event);
    }
};

...

    Toolkit toolkit = Toolkit.getDefaultToolkit();
    toolkit.addAWTEventListener(new AWTListener(), AWTEvent.KEY_EVENT_MASK);
于 2013-01-06T11:34:41.787 に答える
1

MouseMotionListener を追加し、mouseMoved メソッドで pFrame.requestFocusInWindow() を呼び出し、ボタンの actionPerformed メソッドにフォーカス要求を追加することで、この問題を解決しました。ActionListener がボタンに追加されている限り、フレーム内のボタンが 1 つでも、KeyListener は機能しません。これはせいぜい不器用ですが、私にとってはうまくいきます。元のコードが機能しない理由をコミュニティから聞きたいです。

于 2013-01-07T04:50:08.577 に答える