对用户Keyevents作出反应,但不包括laggs JavaFx

对用户Keyevents作出反应,但不包括laggs JavaFx,java,javafx,Java,Javafx,我想做的第一件事是为我的英语道歉,我会尽量写得通俗易懂。 另外,我已经试着寻找这个问题的解决方案,但直到现在我才找到 代码中有问题的部分如下所示: //eventmanagement for the bat scene.setOnKeyPressed (new EventHandler <KeyEvent> () { public void moveBat(double speed) { if ((speed > 0) &

我想做的第一件事是为我的英语道歉,我会尽量写得通俗易懂。 另外,我已经试着寻找这个问题的解决方案,但直到现在我才找到

代码中有问题的部分如下所示:

    //eventmanagement for the bat
    scene.setOnKeyPressed (new EventHandler <KeyEvent> () {
        public void moveBat(double speed) {
            if ((speed > 0) && ((bat.getLayoutX() + bat.getWidth())<scene.getWidth())){
                bat.setLayoutX(bat.getLayoutX() + speed);
            }
            if ((speed < 0) && ((bat.getLayoutX() > 0))){
                bat.setLayoutX(bat.getLayoutX() + speed);
            }
        };

        @Override
        public void handle(KeyEvent event){
            if (event.getCode().toString() == "RIGHT"){
                this.moveBat(batVelocity);          
        }
            if (event.getCode().toString() == "LEFT"){
                this.moveBat(-batVelocity);
        }
    }
    });
//bat的事件管理
scene.setOnKeyPressed(新的EventHandler(){
公用移动蝙蝠(双速){
如果((速度>0)和((bat.getLayoutX()+bat.getWidth())0))){
bat.setLayoutX(bat.getLayoutX()+速度);
}
};
@凌驾
公共无效句柄(KeyEvent事件){
if(event.getCode().toString()==“RIGHT”){
这是moveBat(batVelocity);
}
if(event.getCode().toString()=“左”){
这个.moveBat(-batVelocity);
}
}
});
这个东西可以工作,但是如果我按下左键,我不会取消按下,所以让它保持按下状态,那么“蝙蝠”将向左移动一次,然后延迟大约1秒,然后继续向左移动

我想在左键保持按下时,在左方向上继续移动。有人知道如何解决这个问题吗

非常感谢您的时间和回答


Crutz

因此,
OnKeyPressed
在第一次按下某个键时触发,然后每隔一秒钟左右触发一次。如果您希望连续发生一些事情,而不是在<代码> OnKeKEngEng/<代码>事件发生时,考虑“<代码> OnKyPress的< /COD>”和“代码> OnKelpEng/<代码>控制某种类型的<代码>布尔键按下,并在某种类型的while循环中使用该代码。因此,
onkeyppressed
将设置
keyipressed=true
,而
onkeyereleased
将做相反的事情

因此,
onkeyppressed
在第一次按下某个键时触发,然后每隔一秒左右触发一次。如果您希望连续发生一些事情,而不是在<代码> OnKeKEngEng/<代码>事件发生时,考虑“<代码> OnKyPress的< /COD>”和“代码> OnKelpEng/<代码>控制某种类型的<代码>布尔键按下,并在某种类型的while循环中使用该代码。因此,
onkeyppressed
将设置
keyipressed=true
,而
onkeyereleased
将执行相反的操作

,因此您要做的是将键码保存到列表中,并在动画计时器中进行检查:

字段

    private List<KeyCode> input = new ArrayList<>();
    scene.setOnKeyPressed((KeyEvent event) -> {
        input.add(event.getCode());
    });
    scene.setOnKeyReleased((KeyEvent event) -> {
        input.remove(event.getCode());
    });
    if (input.contains(KeyCode.RIGHT)) {
        //do something
    }
    if (input.contains(KeyCode.LEFT)) {
        //do something else
    }
动画计时器中:

    private List<KeyCode> input = new ArrayList<>();
    scene.setOnKeyPressed((KeyEvent event) -> {
        input.add(event.getCode());
    });
    scene.setOnKeyReleased((KeyEvent event) -> {
        input.remove(event.getCode());
    });
    if (input.contains(KeyCode.RIGHT)) {
        //do something
    }
    if (input.contains(KeyCode.LEFT)) {
        //do something else
    }

因此,您要做的是将关键码保存到列表中,并在AnimationTimer中选中它:

字段

    private List<KeyCode> input = new ArrayList<>();
    scene.setOnKeyPressed((KeyEvent event) -> {
        input.add(event.getCode());
    });
    scene.setOnKeyReleased((KeyEvent event) -> {
        input.remove(event.getCode());
    });
    if (input.contains(KeyCode.RIGHT)) {
        //do something
    }
    if (input.contains(KeyCode.LEFT)) {
        //do something else
    }
动画计时器中:

    private List<KeyCode> input = new ArrayList<>();
    scene.setOnKeyPressed((KeyEvent event) -> {
        input.add(event.getCode());
    });
    scene.setOnKeyReleased((KeyEvent event) -> {
        input.remove(event.getCode());
    });
    if (input.contains(KeyCode.RIGHT)) {
        //do something
    }
    if (input.contains(KeyCode.LEFT)) {
        //do something else
    }

请看和:,这在各方面都是错误的。按如下方式比较按键操作
event.getCode()==KeyCode.RIGHT
好的,非常感谢!!:)请看和:,这在各方面都是错误的。按如下方式比较按键操作
event.getCode()==KeyCode.RIGHT
好的,非常感谢!!:)不是一个while循环,它将锁定应用程序。使用
时间线
将图形作为关键帧的事件,按此键播放,释放时停止。@MouseEvent谢谢,你说得对,我没在想,我打得很快。这个帮助了我,谢谢你的时间线评论!!不是一个while循环,它将锁定应用程序。使用
时间线
将图形作为关键帧的事件,按此键播放,释放时停止。@MouseEvent谢谢,你说得对,我没在想,我打得很快。这个帮助了我,谢谢你的时间线评论@克鲁兹,我的回答对你有帮助吗?如果不让我知道。如果:那么请将其标记为答案!嗨,我尝试了答案,但我仍然有同样的问题!可悲的是,它并没有改变任何事情。如果我一直按下右边的按钮,它仍然会等待一秒钟,直到它不断向右移动。@Crutz我的回答对你有帮助吗?如果不让我知道。如果:那么请将其标记为答案!嗨,我尝试了答案,但我仍然有同样的问题!可悲的是,它没有改变任何事情。如果我一直按下右键,它仍然会等待一秒钟,直到它不断向右移动。