You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Libgdx中如何在ClickListener中触发keyDown()或keyUp()方法

问题:Button的ClickListener中keyDown/keyUp方法无法触发

我编写了一个测试Button的Demo,但遇到问题:ClickListener中的keyDown()和keyUp()方法无法触发,不过该监听器的其他方法(如touchDown、clicked)可正常工作。

我创建Button并将其加入Stage,将Stage设置为InputProcessor,给Button添加自定义的MyButtonClickListener,但按下按键时,keyDown和keyUp方法并未执行。

代码示例

ButtonScreen.java

public class ButtonScreen implements Screen {

    public OrthographicCamera camera;
    public Stage stage;

    public ButtonScreen() {
        
        camera = new OrthographicCamera();
        
        Viewport viewport = new ScreenViewport(camera);
        stage = new Stage(viewport);

        //add stage to Inputprocessor
        Gdx.input.setInputProcessor(stage);

        //make button
        Button button = new Button(new TextureRegionDrawable(ImgConsUtil.timeFileAtlas.findRegion(CardConstant.DO)),
                new TextureRegionDrawable(ImgConsUtil.timeFileAtlas.findRegion(CardConstant.ONE_TIME)));
        button.setPosition(200,200);
        button.addListener(new MyButtonClickListener());

        //add button to stage
        stage.addActor(button);
    }

    @Override
    public void render(float delta) {

        camera.update();
        PreparClass.batch.setProjectionMatrix(camera.combined);
        
        stage.act();
        
        stage.draw();

    }
}

MyButtonClickListener.java

public class MyButtonClickListener extends ClickListener{

    @Override
    public boolean keyDown (InputEvent event, int keycode) {
       
        System.out.println("keyDown");
        return true;
    }

    @Override
    public boolean keyUp (InputEvent event, int keycode) {
        
        System.out.println("keyUp");
        return true;
    }

    @Override
    public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) {
        System.out.println("touchdown");
        return false;
    }

    public void clicked(InputEvent inputEvent, float x,float y){
        System.out.println("clicked");
    }
}

原因分析

  1. 焦点限制:LibGDX中,ClickListener的键盘事件方法(keyDown/keyUp)仅在**对应的Actor获得输入焦点(focus)**时才会被触发,默认情况下Button不具备焦点,也不会自动获取焦点。
  2. 事件消费问题:你的touchDown方法返回了false,这表示未消费该触摸事件,导致Button无法进入正常的交互状态,也无法在点击后自动获取焦点。

解决方法

步骤1:让Button支持焦点

在创建Button后,开启它的可聚焦属性:

button.setFocusable(true);

步骤2:修正touchDown方法的返回值

修改MyButtonClickListener中的touchDown方法,返回true以消费触摸事件,让Button能处理后续的状态变更(包括焦点获取):

@Override
public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) {
    System.out.println("touchdown");
    return true; // 返回true,允许Button处理事件并更新状态
}

步骤3:手动设置焦点(可选)

如果希望Button在创建后立即接收键盘事件,可手动请求焦点:

button.requestFocus();

修改后的Button创建代码片段:

Button button = new Button(new TextureRegionDrawable(ImgConsUtil.timeFileAtlas.findRegion(CardConstant.DO)),
        new TextureRegionDrawable(ImgConsUtil.timeFileAtlas.findRegion(CardConstant.ONE_TIME)));
button.setPosition(200,200);
button.setFocusable(true);
button.requestFocus(); // 初始就获取焦点
button.addListener(new MyButtonClickListener());

内容的提问来源于stack exchange,提问作者ashes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 04:23:20