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

LibGDX框架中ScrollPane内List列表项无法选中问题求助

LibGDX可滚动列表无法选中问题解决方案

核心问题原因

你将List、ScrollPane、Stage等UI组件的初始化逻辑写在了render方法中,render方法是每帧执行的(每秒执行30~60次),相当于每帧都会销毁旧的列表组件、生成全新的组件,之前的点击选中状态会直接被清空,自然看不到选中效果,也无法正常响应交互。

其他潜在问题

  • UI皮肤中selection对应的drawable资源缺失,导致选中状态视觉上没有反馈,实际已选中但看不到
  • 状态切换时输入处理器被其他逻辑覆盖,没有绑定到当前列表所在的Stage
  • ScrollPane缩放后点击坐标计算异常(概率较低,优先排查核心问题)

修复方案

1. 调整初始化逻辑

将所有UI组件的初始化代码迁移到ChangeSongState的构造方法中,仅执行一次:

public ChangeSongState(GameStateManager game) {
    super(game);
    atlas = new TextureAtlas(Gdx.files.internal("uiskin.atlas"));
    skin = new Skin(Gdx.files.internal("SimpleSkin.json"), atlas);
    gameWidth = Gdx.graphics.getWidth();
    gameHeight = Gdx.graphics.getHeight();
    
    // 仅初始化一次列表
    list = new List<String>(skin);
    String[] strings = new String[20];
    for (int i = 0; i < 20; i++) {
        strings[i] = "String: " + i;
    }
    list.setItems(strings);
    // 可选:添加选中监听验证选中状态
    list.addListener(new ChangeListener() {
        @Override
        public void changed(ChangeEvent event, Actor actor) {
            Gdx.app.log("列表选中", "选中内容:" + list.getSelected());
        }
    });

    // 仅初始化一次滚动容器
    scrollPane = new ScrollPane(list);
    scrollPane.setBounds(0, 0, gameWidth, gameHeight + 100);
    scrollPane.setSmoothScrolling(false);
    scrollPane.setPosition(gameWidth / 2 - scrollPane.getWidth() / 4,
            gameHeight / 2 - scrollPane.getHeight() / 4);
    scrollPane.setTransform(true);
    scrollPane.setScale(0.5f);

    // 仅初始化一次Stage,绑定输入处理器
    stage = new Stage(new StretchViewport(gameWidth, gameHeight));
    stage.addActor(scrollPane);
    Gdx.input.setInputProcessor(stage);
}

2. 精简render方法

仅保留清屏、Stage更新和绘制逻辑,删除原update方法避免重复执行act和draw:

@Override
public void render(SpriteBatch sb) {
    Gdx.gl.glClearColor(0, 0, 0, 1); 
    Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    stage.act(Gdx.graphics.getDeltaTime());
    stage.draw();
}

3. 验证皮肤资源

如果调整后点击有日志输出但看不到选中效果,检查你的uiskin.atlas中是否存在名为selection的纹理资源,也可以临时在代码中添加如下逻辑验证:

// 临时设置选中背景为灰色,验证视觉反馈
list.getStyle().selection = new ColorDrawable(Color.GRAY);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 10:54:02