gpt4 book ai didi

java - 如何在拖放过程中接收关键事件?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:04:30 25 4
gpt4 key购买 nike

我目前正在尝试在拖放过程中接收按键事件,但在我看来,焦点在拖动时被带走了,因此我无法收听任何按键事件。

我正在拖动一个实现 KeyListener 的 JComponent 子类,并在 DragSourceListener 的 dragEnter 方法中请求焦点,但我的假设是焦点随后会从它身上移开。

现在,谁获得了焦点,我如何才能将它带回我的 JComponent。或者是否有更适合 dnd 的不同方法?

提前谢谢你。

更新:

完成这项工作需要很多代码,所以我只发布一些片段来向您展示我正在尝试做的事情:

public class Stone extends JComponent implements Serializable, KeyListener {

public Stone(...) {

//...

setFocusable(true);
addKeyListener(this);

this.dragSource = DragSource.getDefaultDragSource();
this.dgListener = new StoneDGListener();
this.dsListener = new StoneDSListener();

this.dragSource.createDefaultDragGestureRecognizer(
this,
DnDConstants.ACTION_MOVE,
this.dgListener
);

//...

}

//...

public void keyPressed(KeyEvent e) {
System.out.println("Stone: "+e.getKeyCode());
}

//...

public class StoneDSListener implements DragSourceListener, Serializable {

//...

@Override
public void dragEnter(DragSourceDragEvent dsde) {
//...
Stone.this.requestFocus();
addKeyListener(Stone.this);
}

//...
}
}

发生的事情是,在我拖动 Stone 组件之前,我的 JPanel 获得了焦点,因此它接收到我按下的任何键。在拖动过程中,我听不到任何按下的键(所以我不知道谁得到了焦点),即使我在 dragEnter() 中请求它并且在我释放 Stone 任何关键事件都会发送到 Stone

这个问题可能并不重要,但为了说明我在做什么这里有一个截图:

image showing the "drag" http://img685.imageshack.us/img685/1884/pico.png(在这里,我将 Stone 从下面的集合中拖到顶部的游戏字段中)。在这种状态下,我不知道如何找出按下了什么键。我需要解决这个问题才能旋转 Stone

最佳答案

不确定在拖放过程中谁获得了焦点。但是您的问题的另一种解决方案是添加 KeyEventDispatcher为您的 Stone 类(class)提供 KeyboardFocusManager .来自 JavaDoc:

The KeyboardFocusManager is both a centralized location for client code to query for the focus owner and initiate focus changes, and an event dispatcher for all FocusEvents, WindowEvents related to focus, and KeyEvents+.

+ 我的焦点。

基本上,我们使用类似的代码在 KeyEvents 击中具有焦点的组件之前拦截它们。

只是针对您的特定拖放上下文对其进行了快速测试,它似乎工作正常(只要您的应用程序在操作系统中具有焦点)。本质上是这样的:

Public Stone(...) {
// ...

KeyboardFocusManager fm = KeyboardFocusManager.getCurrentKeyboardFocusManager();
fm.addKeyEventDispatcher(
new KeyEventDispatcher() {
public boolean dispatchKeyEvent(KeyEvent e) {
System.out.println("Key Press: " + e.getKeyChar());
return false;
}
}
);

// ...
}

当用户不再拖放时,您需要做一些关于启用和禁用的跑腿工作,因为我的测试目前一直在打印。

我还想知道是否可以使用 KeyboardFocusManager 来确定在拖放过程中谁最终获得了焦点?

无论如何,我希望这能给你一些新的想法来尝试。

关于java - 如何在拖放过程中接收关键事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1914996/

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