gpt4 book ai didi

java - Java Swing 同时进行 MouseEntered 和 KeyPressed

转载 作者:行者123 更新时间:2023-12-01 05:05:37 25 4
gpt4 key购买 nike

使用 Java Swing 我有 20 个 JLabels。每个 JLabel 都有一个 MouseListener 和一个 KeyListener。我一直在尝试想出一种方法(没有运气)能够知道鼠标进入/悬停在哪个标签上以及何时按下删除键。

例如,当按下删除键并且鼠标位于 JLabel 5 中时。我想要对 JLabel 5 执行操作。

我知道如何独立使用 MouseListenerKeyListener,但我不知道如何像那样一起使用它们。

这是我正在尝试做的事情。

    public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_DELETE){
//Get the JLabel that the mouse has entered/hovering over
//Perform action on that JLabel

}
}

以防万一,我为所有 JLabel 使用了一个列表。

最佳答案

可能会让您感到惊讶的建议:

  • 惊喜数字 1:不要使用 MouseListener
  • 惊喜之二:不要使用 MouseMotionListener。
  • 惊喜之三:不要使用 KeyListeners。
  • 改为使用键绑定(bind)(教程在这里:Key Bindings Tutorial)。我建议您将删除键绑定(bind)到包含 JLabel 网格的 JPanel 上。然后,当按下删除键时,通过使用 MouseInfo 类获取 PointerInfo 实例,找出光标位于哪个 JLabel(如果有),并由此获取光标在屏幕上的位置。有了这些信息和一些简单的数学运算,您应该很容易找出哪个标签有光标(同样,如果有的话),并执行适当的操作。请注意,Key Bindings 教程将告诉您为什么使用这些而不是 KeyListeners 更好,但最重要的是,您不必过多关注应用程序的焦点。

编辑例如:

import java.awt.Component;
import java.awt.GridLayout;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.PointerInfo;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;

import javax.swing.*;

@SuppressWarnings("serial")
public class BindingExample extends JPanel {
private static final int ROWS = 10;
private static final int COLS = 8;
JLabel[][] labels = new JLabel[ROWS][COLS];

public BindingExample() {
setLayout(new GridLayout(ROWS, COLS));
for (int r = 0; r < labels.length; r++) {
for (int c = 0; c < labels[r].length; c++) {
String labelText = String.format("[%d, %d]", r, c);
labels[r][c] = new JLabel(labelText, SwingConstants.CENTER);
int eb = 4;
labels[r][c].setBorder(BorderFactory.createEmptyBorder(eb, eb, eb, eb));
add(labels[r][c]);
}
}

int condition = JComponent.WHEN_IN_FOCUSED_WINDOW;
InputMap inputMap = getInputMap(condition);
ActionMap actionMap = getActionMap();

KeyStroke delKeyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0);
String delete = "delete";

inputMap.put(delKeyStroke, delete);
actionMap.put(delete, new DeleteAction());
}

private class DeleteAction extends AbstractAction {
@Override
public void actionPerformed(ActionEvent evt) {
PointerInfo pInfo = MouseInfo.getPointerInfo();
Point ptOnScrn = pInfo.getLocation();
int xPanel = getLocationOnScreen().x;
int yPanel = getLocationOnScreen().y;
int x = ptOnScrn.x - xPanel;
int y = ptOnScrn.y - yPanel;

Component component = getComponentAt(x, y);
if (component != null) {
JLabel selectedLabel = (JLabel) component;
System.out.println("Selected Label: " + selectedLabel.getText());
}
}
}

private static void createAndShowGui() {
BindingExample mainPanel = new BindingExample();

JFrame frame = new JFrame("Key Bindings Example");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}

编辑2
哎呀,刚刚看到了对您问题的评论,是的,JList 可能更适合您的目的。

关于java - Java Swing 同时进行 MouseEntered 和 KeyPressed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24986812/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com