LibGDX中Table内图片无法显示,请求排查代码问题
为什么我的LibGDX代码运行正常但看不到图片?
先看一下你提供的代码:
public class MyGdxGame extends ApplicationAdapter { SpriteBatch batch; Texture img; Stage stage; @Override public void create () { stage=new Stage(); batch = new SpriteBatch(); Image mg=new Image(new Texture("badlogic.jpg")); Table table=new Table(); table.add(); table.add(mg); table.add(); stage.addActor(table); } @Override public void render () { Gdx.gl.glClearColor(1, 0, 0, 1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); batch.begin(); batch.end(); stage.draw(); } @Override public void dispose () { batch.dispose(); } }
看不到图片的核心原因是你的Table没有正确占据Stage的空间,导致图片所在的布局容器根本没显示在可视区域里,具体问题和修复方案如下:
主要问题分析
Table未绑定到Stage视口
你创建了Table但没有设置它填充整个Stage,默认情况下Table的大小只是刚好包裹它的内容。而你添加的两个空table.add()单元格没有任何尺寸,整个Table会缩成一个很小的区域(甚至可能是0尺寸),图片自然就看不到了。空白单元格未设置扩展规则
就算Table有了尺寸,你原来的table.add()只是添加空单元格,但没有让它们占据剩余空间,图片会被挤在左上角,但因为Table本身没大小,还是显示不出来。资源销毁不完整(潜在问题)
你创建了Texture但没有在dispose()里释放,而且img变量完全没用到,会造成内存泄漏。另外Stage也需要销毁。
修复后的代码
public class MyGdxGame extends ApplicationAdapter { SpriteBatch batch; Texture img; Stage stage; @Override public void create () { stage = new Stage(); batch = new SpriteBatch(); // 保存Texture引用,方便后续销毁 img = new Texture("badlogic.jpg"); Image mg = new Image(img); Table table = new Table(); // 关键:让Table填满整个Stage的视口 table.setFillParent(true); // 让左侧空白单元格占据水平剩余空间 table.add().expandX(); table.add(mg); // 让右侧空白单元格占据水平剩余空间,实现图片居中 table.add().expandX(); stage.addActor(table); } @Override public void render () { Gdx.gl.glClearColor(1, 0, 0, 1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); // 这里的SpriteBatch begin/end是多余的,Stage自己会处理渲染 stage.draw(); } @Override public void dispose () { batch.dispose(); // 销毁Texture,释放GPU资源 img.dispose(); // 销毁Stage及其内部的所有Actor stage.dispose(); } }
关键修改点说明
table.setFillParent(true):强制Table的大小和Stage的视口一致,这样布局才能在整个屏幕范围内生效。table.add().expandX():让空白单元格扩展以占据水平方向的剩余空间,从而将图片居中显示。- 完善
dispose()方法:清理所有创建的资源,避免内存泄漏。 - 移除无用的
batch.begin()/batch.end():Stage内部有自己的SpriteBatch,不需要额外调用。
内容的提问来源于stack exchange,提问作者Grinning Trout
相关产品推荐
相关产品推荐

