我创建了扩展 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/