java - 如何在鼠标进入时将KeyListener 添加到JComponent?

标签 java swing keylistener jcomponent

我创建了扩展 JComponent 的自定义按钮类,并希望在 mouseEntered 事件上添加 KeyListener(稍后在 mouseExited 上删除)。所以我的目标是 - 当鼠标进入此 JComponent - 然后如果我按 Enter - 将执行一些代码,仅与此按钮相关。我该怎么做?

最佳答案

使用Key Bindings而不是 KeyListeners,因为后者是 Swing 的低级别方式。只需将鼠标移到 JButton 上,然后按 ENTER,然后将鼠标移到 JButton 的范围外并尝试按 再次输入 。看看这个例子,看看这是不是你想要的:

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

public class ButtonBinding {

    private JPanel contentPane;
    private JTextField tField;
    private JButton button;
    private KeyStroke keyStroke = KeyStroke.getKeyStroke("ENTER");

    private Action action = new AbstractAction() {
        @Override
        public void actionPerformed(ActionEvent ae) {
            System.out.println("Action Performed");
            contentPane.setBackground(Color.BLUE);
        }
    };

    private MouseAdapter mouseActions = new MouseAdapter() {
        @Override
        public void mouseEntered(MouseEvent me) {
            System.out.println("Mouse Entered");
            JButton button = (JButton) me.getSource(); 
            button.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(keyStroke, "enter");
            button.getActionMap().put("enter", action);
        }

        @Override
        public void mouseExited(MouseEvent me) {
            System.out.println("Mouse Exited");
            JButton button = (JButton) me.getSource();
            button.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(keyStroke, "none");
            contentPane.setBackground(Color.RED);
        }
    };  

    private void displayGUI() {
        JFrame frame = new JFrame("Button Binding Example");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        contentPane = new JPanel();
        contentPane.setOpaque(true);
        tField = new JTextField(10);
        button = new JButton("Click Me");
        button.addMouseListener(mouseActions);

        contentPane.add(tField);
        contentPane.add(button);

        frame.setContentPane(contentPane);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                new ButtonBinding().displayGUI();
            }
        };
        EventQueue.invokeLater(runnable);
    }
}

关于java - 如何在鼠标进入时将KeyListener 添加到JComponent?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18234500/

相关文章:

java - 无法识别来自 KeyListener 的输入

java - 防止覆盖 bean 的 bean 定义

java - 方法未返回正确的值 (Java)

java - 为什么树遍历的PreOrder、InOrder、PostOrder中总是LEFT先于RIGHT遍历

java - 荣格不能画白色矩形作为顶点

java - 将 RSS 加载到 JEditorPane 中

java - 调用 pack() 后如何在面板上画一条线?

java - 启动 : applet not initialized error. 如何解决此问题?

java - 静态变量 : Good or Bad?

java - 带数字键盘的按键监听器?