使用Java
Swing我有20个JLabels
。每个JLabel
都有一个MouseListener
和一个KeyListener
。我一直在试图找到一种方法(没有运气),以便能够知道鼠标已输入/悬停在哪个标签上以及何时按下了删除键。
例如,当按下Delete键并且鼠标位于JLabel
5上时,我希望对JLabel 5进行操作。
我知道如何使用MouseListener
和KeyListener
独立,但我不知道如何一起使用它们这样。
这是我正在尝试做的事情。
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使用List。
可能使您感到惊讶的建议:
编辑 例如:
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
Shoot,只是看到您问题的评论,是的,对于您的目的而言,JList可能会更好。
本文向大家介绍mouseover和mouseenter的区别?相关面试题,主要包含被问及mouseover和mouseenter的区别?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: mouseover:当鼠标移入元素或其子元素都会触发事件,所以有一个重复触发,冒泡的过程。对应的移除事件是mouseout mouseenter:当鼠标移除元素本身(不包含元素的子元素)会触发事件,也就是不会
本文向大家介绍javascript中mouseenter与mouseover的异同,包括了javascript中mouseenter与mouseover的异同的使用技巧和注意事项,需要的朋友参考一下 不知道大家在面试或者工作过程中有没有被 mouseover 和 mouseenter (对应的是 mouseout 和 mouseleave )事件所困扰。自己之前在面试的时候就有被问到诸如mouse
对于伸缩/故障转移,mongodb使用“副本集”,其中有一个主服务器和一个或多个辅助服务器。Primary用于写操作。中学用于阅读。这几乎是SQL编程中使用的主从模式。如果主节点下降,则次节点集群中的次节点将取代它的位置。因此,水平伸缩和故障转移的问题得到了解决。然而,这似乎不是一个允许分叉的解决方案。一个真正的碎片只保存整个数据的一部分,所以如果副本集中的次要碎片是碎片,当它没有服务请求所需的所
问题内容: 假设我要实现一个非常简单的类,并且要注意并发和多线程问题, 即使是以下方法,还是要这样做吗? 另一方面,如果我们将所有方法都同步了,就不会再使用了,对吗? 问题答案: 将您的金额声明为不会阻止线程在方法执行过程中被抢占(如果未同步)。因此,举例来说,如果您的方法没有以任何方式同步,即使您的方法数量达到 这些问题称为比赛条件。一个可能的示例是,当两个线程尝试从同一帐户转移资金时。当一个线
我正在使用Intellij13.1.5和Java8 SDK,我已经设置了IntelliJ内置的nullness检查器,以便使用作为我选择的注释。 现在,当我写一个像这样的简单类时 我的下一个猜测是,多个库使用相同的注释名称,可能会出现名称冲突。但不幸的是,警告没有指定包的确切类名。如果是这种情况,一定有某种设置启用隐式注释。 如何在不删除注释的情况下删除此警告?
我有下面的代码,它做(第一部分)什么我想画一个棋盘上有一些棋子。 也就是说,它得到一个棋子的图像和图像的高度,它将图像的绘制转换为棋子所在的正方形,并将图像缩放到正方形的大小。 假设我想把黑色的部分旋转180度。我希望在某个地方有这样的东西: 如果我进入SmallChessboardComponent并从第一个rotation transform语句中删除注释delims,我将rook颠倒在原来的