2

フレームをkeyListenerに登録しましたが、keyListenerはアクションを起動しません。もう 1 つのコードでは、KeyListener インターフェースを実装し、JFrame を登録し、適切なメソッドをオーバーライドするだけで、keyListener を機能させることができました。

import java.awt.BorderLayout;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Mains implements KeyListener {
    private static Point point = new Point();

    public Mains() {
        final JFrame frame = new JFrame();
        frame.setUndecorated(true);
        JButton button = new JButton("Close Me");
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });

        frame.addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e) {
                point.x = e.getX();
                point.y = e.getY();
            }
        });
        frame.addMouseMotionListener(new MouseMotionAdapter() {
            public void mouseDragged(MouseEvent e) {
                Point p = frame.getLocation();
                frame.setLocation(p.x + e.getX() - point.x, p.y + e.getY()
                        - point.y);
            }
        });

        frame.setSize(300, 300);
        frame.setLocation(200, 200);
        frame.setLayout(new BorderLayout());

        frame.getContentPane().add(button, BorderLayout.NORTH);
        frame.getContentPane().add(new JLabel("Drag Me", JLabel.CENTER),
                BorderLayout.CENTER);
        frame.setVisible(true);
        frame.addKeyListener(this);
    }

    public static void main(String[] args) {
        new Mains();
    }

    public void keyPressed(KeyEvent e) {
        System.out.println("pressed");
    }

    public void keyReleased(KeyEvent e) {
        System.out.println("released");
    }

    public void keyTyped(KeyEvent e) {

    }
}
4

2 に答える 2

4

デフォルトでは、JFrameウィンドウ コンポーネントはフォーカス可能ではありません。を呼び出すこともできますが、キー バインドJFrame.setFocusable(true)を使用する方がはるかに優れています。

KeyListenerとの相互作用を機能させるには、コンポーネントにフォーカスする必要がありますKeyEvents。対照的に、キー バインディングを使用すると、コンポーネントにフォーカスがない場合でも、Action を KeyStroke にマップできます。

于 2013-01-21T21:05:07.063 に答える
4

は、アタッチされているKeyListernerコンポーネントがフォーカスを受け取ることができ、フォーカスがある場合にのみ、キー イベントを受け取ることができます。

の問題は、フレームの表面全体を占めるコンテンツ ペインを含む が含まJFrameれていることですJRootPane。これにより、フレームがフォーカスを得られなくなり、キー イベントを受け取ることができなくなります。

KeyListener適切な API を選択することはめったにありません。通常は、キー バインディングを使用することをお勧めします。

関心のあるルート ペインの使用方法も見つかる場合があります。

于 2013-01-21T21:05:50.743 に答える