2009-12-16 38 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