2013-05-19 43 views
1

我對Key Bindings有點新,因爲直到最近KeyListeners被證明是我最大的障礙之前,我一直在使用KeyListeners。我想知道如何用KeyBindings編程一個類似keyreleased的事件。 KeyListeners提供了簡單的三種方法:keyPressed,keyTyped和keyReleased,但對於如何使用Key Bindings實現這一點,我有點困惑。在Java中使用鍵綁定的keyReleased()方法?

基本上,當用戶按下UP時,我想要一個物體向上移動。但是當用戶釋放UP時,對象應該自動向下移動以模擬基本重力。這是我的一些代碼,顯示了UpAction類。

class UpAction extends AbstractAction 
{ 
    public void actionPerformed(ActionEvent tf) 
    { 
     north = true; 
     helitimer.start(); 
     helitimer.start(); 
     helitimer2.start(); 
     repaint(); 
    } 
} 

三個helitimers是啓動一系列定時器的到連續且平滑地增加的對象的y位置定時器對象。當upAction動作被調用時,UpAction類被調用,三個定時器開始移動對象。

是否有反正我可以做到這一點,當用戶釋放UP時,該動作不再被調用,定時器停止?

非常感謝!

+2

對於[示例](http://stackoverflow.com/a/14001011/230513)。 – trashgod

+1

這裏是另一個[示例](http://stackoverflow.com/a/11534873/1057230) –

回答

3

我想知道你將如何編程與鍵綁定

正是你的keyPressed事件做同樣的方式調用keyReleased般的事件。不同之處在於KeyStroke。閱讀KeyStroke API,演示如何爲keyReleased事件創建KeyStroke。取決於您想要如何創建KeyStroke,有幾種不同的方法。

KeyStroke方法假定keyPressed,因此您需要爲keyReleased事件添加其他參數或其他關鍵字。我不知道您使用哪種方法創建KeyStroke,因此我無法告訴您確切的更改。檢查API的細節。

三個helitimers是啓動一系列計時器的不斷遞增對象的y位置Timer對象,並順利

你不應該需要3個定時器這一點。一個定時器應該令人滿意地工作。

是否有反正我可以做到這一點,當用戶釋放UP時,該動作不再被調用,定時器停止?

如果你可以在keyPress動作中「啓動」Timer,那麼你可以在keyReleasedAction中「停止」定時器。所有你需要的是對定時器的引用。根據您發佈的代碼,您已將Timer定義爲類變量,所以這不應該成爲問題。

但是當用戶釋放UP,對象應該向下自動移動,以模擬重力基本

聽起來像你對我會需要另一個定時器來做到這一點。

另一種選擇是始終讓Timer運行。然後,當按下UP鍵時,您將Y增加一個負值。當UP鍵被釋放時,你使Y增加一個正值。

+0

謝謝,我會參考API。我發現1個計時器不能提供我需要的物體速度。增加y變量的增量只會使程序閃爍。 – applemavs