2009-12-16 21 views
3

我目前正在尝试在拖放过程中接收关键事件,但在我看来,重点在拖动时被带走,因此我无法听到任何重要事件。如何在拖放过程中接收重要事件?

我拖动了一个实现KeyListener的JComponent子类,并请求DragSourceListener的dragEnter方法中的焦点,但我的假设是焦点在之后被带走。现在

,谁拥有的焦点,我怎么能拿走它回到我的JComponent。还是有一种更适合dnd的方法?

预先感谢您。

UPDATE

这是一个很大的必要做这个工作,所以我只打算张贴一些片段告诉你什么是我想要做的代码:

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

+0

是否可以放置您正在使用的代码?你在使用任何IDE吗? – medopal 2009-12-20 15:13:08

+0

我试图放入尽可能多的代码,因为我认为这会有所帮助。我不认为它有什么区别,但我没有任何插件使用Eclipse Ganymede。顺便说一句。这不是一个小程序,而是一个标准的桌面应用程序。 – 2009-12-22 00:09:09

回答

3

不知道一个拖放过程中谁具有焦点。但是,对于您的问题的替代解决方案将是为您的Stone类添加KeyEventDispatcherKeyboardFocusManager。根据JavaDoc:

KeyboardFocusManager既是客户端代码查询焦点所有者并启动焦点更改一个集中的位置,和事件调度所有 FocusEvents,的WindowEvent有关对焦,的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来确定在拖放过程中谁最终确定焦点?

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

+0

这看起来非常有前途,迄今为止效果很好。我没有时间来制定启用/禁用部分,但这似乎并不复杂。只要我找到时间来尝试一下,我会尽快接受你的回答。非常感谢 ! – 2009-12-22 21:31:04

+0

工作得很好。谢谢! – 2009-12-26 22:44:57