ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java-如何在拖放期间接收关键事件?

2019-12-10 11:02:46  阅读:275  来源: 互联网

标签:focus swing drag-and-drop java


我目前正在尝试在拖放过程中接收关键事件,但是在我看来,拖动时焦点已移开,因此我听不到任何关键事件.

我正在拖动一个实现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添加到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+.

  我的重点.

基本上,我们使用类似的代码来拦截KeyEvent,然后再击中具有焦点的Component.

只是对您的特定拖放上下文进行了快速测试,它似乎可以正常工作(只要您的应用程序集中在操作系统内).本质上类似于以下内容:

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确定在拖放过程中谁最终以焦点为焦点?

无论如何,我希望这能给您一些新的尝试.

标签:focus,swing,drag-and-drop,java
来源: https://codeday.me/bug/20191210/2101237.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有