我使用LWUIT编写了一个j2me应用程序。它在模拟器和symbian设备上都能很好地工作。但当我试图在诺基亚s40设备上运行它时,它显示了一条"无内容显示"的消息。我试着按照一些论坛的规定显示启动画面。尽管如此,这款应用程序始终无法通过启动屏幕。
编辑1
Display.init(this);
Resources r = Resources.open("/theme.res");
UIManager.getInstance().setThemeProps(r.getTheme(r.getThemeResourceNames()[0]));
Dialog splash = new Dialog("Splash Screen");
splash.setAutoDispose(true);
splash.setTimeout(5000);
splash.show();
RecordStore rs = null;
byte[] buffer = null;
rs = RecordStore.openRecordStore("xxxxxx", true);
if (rs.getNumRecords() > 0) {
buffer = rs.getRecord(rs.getNumRecords());
num = new String(buffer, 0, buffer.length);
rs.closeRecordStore();
offer(num); // a method which displays main form
} else {
rs.closeRecordStore();
registration("xxxxx"); //another method which displays the secondary form
}
在这个代码片段中,在对话框/闪屏之后,设备上显示一个空白屏幕。当我删除管理RecordStore的代码时,将显示表单。如何解决这个问题?
编辑2 注册代码()
Form f = new Form();
f.setLayout(new BoxLayout(BoxLayout.Y_AXIS));
Image img = Image.createImage("logo.png");
f.addComponent(new Label(img));
Label lbl = new Label(msg);
f.addComponent(lbl);
f.addComponent(new Label("xxxxx"));
final TextArea number = new TextArea(1, 10, TextArea.NUMERIC);
f.addComponent(number);
Button btn = new Button("Register");
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
//perform rms related activities and move onto offer()
}
});
f.addComponent(btn);
Button help = new Button("Help?");
help.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
//display a help dialog
}
});
f.addComponent(help);
f.addCommandListener(this);
f.show();
将splash.show()
更改为splash.showModeless()
不管你的代码是不正确的,因为它假设show()
将立即显示对话框,这不是大多数GUI框架的工作方式。您的方法需要完成并将控制权返回给LWUIT,以便显示对话框。但是,您阅读了RMS,然后显示表单的代码不清楚,您希望它何时实际发生。
你需要在没有超时的情况下显示对话框(我将使用一个窗体的闪屏,没有理由使用一个对话框),然后打开一个线程(新线程(…))做任何你想做的,然后当线程完成显示你的窗体
从这个博客,Nothing to display问题是标准的诺基亚S40延迟呼叫setCurrent()
的行为,正常的建议是在早期显示启动屏幕以避免此提示。
也看看这个相同的相关讨论。
编辑:Form splashscreen = new Form();
splashscreen.getStyle().setBgImage(imageName);
splashscreen.show()
Display.getInstance().callSerially(new Runnable() {
public void run() {
try {
Thread.sleep(5000L);
// do RMS related things here.
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
});