libGDX Java(桌面):SelectBox 抛出异常
libGDX Java (Desktop): SelectBox throwing exception
我在为我的应用程序创建 select 框时遇到问题。我在其他任何地方都找不到解决方案。
我的代码:
public class OptionsMenu implements Screen{
private Stage stage = new Stage();
private Skin skin = new Skin(Gdx.files.internal("jsonurlhere"), new TextureAtlas(Gdx.files.internal("atlasurlhere")));
private String[] viewmodes = new String[] {"Fullscreen", "Windowed"};
private SelectBox<String> viewmode;
@Override
public void show() {
viewmode = new SelectBox<String>(skin);
viewmode.setItems(viewmodes);
viewmode.setSelected("Fullscreen");
stage.addActor(viewmode);
}
@Override
public void render(float delta) {
Gdx.gl.glClearColor(100, 100, 100, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
stage.act();
stage.draw();
}
}
注意:这不是完整的代码,只是 select 框中的相关部分。
我的错误:
Exception in thread "LWJGL Application" java.lang.NullPointerException
at com.badlogic.gdx.scenes.scene2d.ui.SelectBox.layout(SelectBox.java:193)
at com.badlogic.gdx.scenes.scene2d.ui.Widget.validate(Widget.java:88)
at com.badlogic.gdx.scenes.scene2d.ui.SelectBox.getPrefWidth(SelectBox.java:290)
at com.badlogic.gdx.scenes.scene2d.ui.SelectBox.<init>(SelectBox.java:80)
at com.badlogic.gdx.scenes.scene2d.ui.SelectBox.<init>(SelectBox.java:71)
at com.lockedprogramming.pacificblitz.screens.OptionsMenu.show(OptionsMenu.java:49)
at com.badlogic.gdx.Game.setScreen(Game.java:61)
at com.lockedprogramming.pacificblitz.PacificBlitz.create(PacificBlitz.java:18)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:143)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.run(LwjglApplication.java:120)
Eclipse 在运行前没有显示任何错误,如果我注释掉以下几行,程序不会抛出异常:
//viewmode = new SelectBox<String>(skin);
//viewmode.setItems(viewmodes);
//viewmode.setSelected("Fullscreen");
//stage.addActor(viewmode);
编辑:我的 .json 代码:
{
com.badlogic.gdx.scenes.scene2d.ui.SelectBox$SelectBoxStyle: {
default: {
font: menufontblack, background: menubuttondefault,
listStyle: { font: menufontblack, selection: menubuttonhover },
},
},
}
异常消息似乎指出在 class SelectBox 的第 193 行创建 SelectBox 项目失败;它无法设置布局,因此它 return null 并且它不被接受,即您实例化 SelectBox/Skin 的方式不正确。
在外观 json 文件的 SelectBoxStyle 定义中没有定义 ScrollStyle。我很确定这是你的问题。我可以通过删除 ScrollStyle 声明在我的一个 libgdx 项目中重现该问题。
尝试以下操作并为您的 SelectBox 设置默认的 ScrollStyle:
com.badlogic.gdx.scenes.scene2d.ui.SelectBox$SelectBoxStyle: {
default: {
font: menufontblack, background: menubuttondefault,
scrollStyle: default,
listStyle: { font: menufontblack, selection: menubuttonhover },
},
}
您还可以在此处查看示例 uiskin json 文件:https://github.com/libgdx/libgdx/blob/master/tests/gdx-tests-android/assets/data/uiskin.json
更新: 你还需要在 json 中定义一个滚动样式。类似于:
com.badlogic.gdx.scenes.scene2d.ui.ScrollPane$ScrollPaneStyle: {
default: { vScroll: default-scroll, hScrollKnob: default-round-large, background: default-rect, hScroll: default-scroll, vScrollKnob: default-round-large }
},
最好是查看 github 处的 uiskin 示例,看看这些纹理看起来如何 https://github.com/libgdx/libgdx/wiki/Skin#overview
我在为我的应用程序创建 select 框时遇到问题。我在其他任何地方都找不到解决方案。
我的代码:
public class OptionsMenu implements Screen{
private Stage stage = new Stage();
private Skin skin = new Skin(Gdx.files.internal("jsonurlhere"), new TextureAtlas(Gdx.files.internal("atlasurlhere")));
private String[] viewmodes = new String[] {"Fullscreen", "Windowed"};
private SelectBox<String> viewmode;
@Override
public void show() {
viewmode = new SelectBox<String>(skin);
viewmode.setItems(viewmodes);
viewmode.setSelected("Fullscreen");
stage.addActor(viewmode);
}
@Override
public void render(float delta) {
Gdx.gl.glClearColor(100, 100, 100, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
stage.act();
stage.draw();
}
}
注意:这不是完整的代码,只是 select 框中的相关部分。
我的错误:
Exception in thread "LWJGL Application" java.lang.NullPointerException
at com.badlogic.gdx.scenes.scene2d.ui.SelectBox.layout(SelectBox.java:193)
at com.badlogic.gdx.scenes.scene2d.ui.Widget.validate(Widget.java:88)
at com.badlogic.gdx.scenes.scene2d.ui.SelectBox.getPrefWidth(SelectBox.java:290)
at com.badlogic.gdx.scenes.scene2d.ui.SelectBox.<init>(SelectBox.java:80)
at com.badlogic.gdx.scenes.scene2d.ui.SelectBox.<init>(SelectBox.java:71)
at com.lockedprogramming.pacificblitz.screens.OptionsMenu.show(OptionsMenu.java:49)
at com.badlogic.gdx.Game.setScreen(Game.java:61)
at com.lockedprogramming.pacificblitz.PacificBlitz.create(PacificBlitz.java:18)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:143)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.run(LwjglApplication.java:120)
Eclipse 在运行前没有显示任何错误,如果我注释掉以下几行,程序不会抛出异常:
//viewmode = new SelectBox<String>(skin);
//viewmode.setItems(viewmodes);
//viewmode.setSelected("Fullscreen");
//stage.addActor(viewmode);
编辑:我的 .json 代码:
{
com.badlogic.gdx.scenes.scene2d.ui.SelectBox$SelectBoxStyle: {
default: {
font: menufontblack, background: menubuttondefault,
listStyle: { font: menufontblack, selection: menubuttonhover },
},
},
}
异常消息似乎指出在 class SelectBox 的第 193 行创建 SelectBox 项目失败;它无法设置布局,因此它 return null 并且它不被接受,即您实例化 SelectBox/Skin 的方式不正确。
在外观 json 文件的 SelectBoxStyle 定义中没有定义 ScrollStyle。我很确定这是你的问题。我可以通过删除 ScrollStyle 声明在我的一个 libgdx 项目中重现该问题。
尝试以下操作并为您的 SelectBox 设置默认的 ScrollStyle:
com.badlogic.gdx.scenes.scene2d.ui.SelectBox$SelectBoxStyle: {
default: {
font: menufontblack, background: menubuttondefault,
scrollStyle: default,
listStyle: { font: menufontblack, selection: menubuttonhover },
},
}
您还可以在此处查看示例 uiskin json 文件:https://github.com/libgdx/libgdx/blob/master/tests/gdx-tests-android/assets/data/uiskin.json
更新: 你还需要在 json 中定义一个滚动样式。类似于:
com.badlogic.gdx.scenes.scene2d.ui.ScrollPane$ScrollPaneStyle: {
default: { vScroll: default-scroll, hScrollKnob: default-round-large, background: default-rect, hScroll: default-scroll, vScrollKnob: default-round-large }
},
最好是查看 github 处的 uiskin 示例,看看这些纹理看起来如何 https://github.com/libgdx/libgdx/wiki/Skin#overview