Codename One Java Hello World程序按钮添加异常问题求助
你遇到的问题根源在于错误使用了Java桌面AWT的Button组件,而非Codename One框架自带的Button,后续的代码修改也偏离了正确的组件添加逻辑。下面是一步步的修复方案:
1. 替换错误的导入语句
你之前添加的import java.awt.*;是桌面Java的UI组件包,和Codename One的跨平台组件完全不兼容。删掉这行,换成Codename One自己的Button导入:
import com.codename1.ui.Button;
2. 恢复正确的组件添加代码
编译器提示的hi.add(String.valueOf(b));是错误的修改方式——这相当于把Button对象转成字符串文本添加到Form里,而非添加可交互的按钮组件本身。把这行改回原来的正确写法:
hi.add(b);
完整修正后的代码
package CodenameOneHelloWorld; import static com.codename1.ui.CN.*; import com.codename1.ui.Display; import com.codename1.ui.Form; import com.codename1.ui.Dialog; import com.codename1.ui.Label; import com.codename1.ui.Button; // 正确的Button导入 import com.codename1.ui.plaf.UIManager; import com.codename1.ui.util.Resources; import com.codename1.io.Log; import com.codename1.ui.Toolbar; import java.io.IOException; import com.codename1.ui.layouts.BoxLayout; import com.codename1.io.NetworkEvent; /** * This file was generated by Codename One for the purpose * of building native mobile applications using Java. */ public class MyApplication { private Form current; private Resources theme; public void init(Object context) { // use two network threads instead of one updateNetworkThreadCount(2); theme = UIManager.initFirstTheme("/theme"); // Enable Toolbar on all Forms by default Toolbar.setGlobalToolbar(true); // Pro only feature Log.bindCrashProtection(true); addNetworkErrorListener(err -> { // prevent the event from propagating err.consume(); if(err.getError() != null) { Log.e(err.getError()); } Log.sendLogAsync(); Dialog.show("Connection Error", "There was a networking error in the connection to " + err.getConnectionRequest().getUrl(), "OK", null); }); } public void start() { if(current != null){ current.show(); return; } Form hi = new Form("Hi World", BoxLayout.y()); hi.add(new Label("Hi World")); Button b = new Button("Show Dialog"); hi.add(b); // 正确添加Button组件 b.addActionListener((e) -> Dialog.show("Dialog Title", "Hi", "OK", null)); hi.show(); } public void stop() { current = getCurrentForm(); if(current instanceof Dialog) { ((Dialog)current).dispose(); current = getCurrentForm(); } } public void destroy() { } }
为什么之前的修改会失败?
- Codename One有一套独立的UI组件库,所有界面元素都在
com.codename1.ui包下,和Java桌面的AWT/Swing组件不通用,导入java.awt.Button会导致组件无法在Codename One模拟器中正常渲染。 - 将Button转成字符串添加,本质是在Form中插入了一段描述Button对象的文本,而非可交互的按钮组件,所以你看不到按钮,点击事件自然也不会生效。
修改完成后重新编译运行,模拟器里就能看到正常显示的按钮,点击后会弹出预期的对话框。
内容的提问来源于stack exchange,提问作者Paolo Barone
相关产品推荐
相关产品推荐

