使用 NetBeans 18,开发一个使用 Initializr 构建的 Codename One 应用程序。 我通过重新创建项目并传输所有内容解决了最后一个问题。现在我开始添加元素,我解决了代码中需要纠正的问题,并且项目将构建。我已经注释掉了需要处理的元素,试图在模拟器中获得总体外观。 当我尝试运行该应用程序时,出现以下错误。我查看了 CodenameOneImplementation.createFont,没有发现 Codename One 库中的 createFont 实例有任何问题。
`your text`java.lang.NullPointerException: Cannot invoke "com.codename1.impl.CodenameOneImplementation.createFont(int, int, int)" because "i" is null
at com.codename1.ui.Font.<init>(Font.java:99)
at com.codename1.ui.Font.createSystemFont(Font.java:399)
at com.codename1.ui.plaf.UIManager.resetThemeProps(UIManager.java:427)
at com.codename1.ui.plaf.UIManager.<init>(UIManager.java:108)
at com.codename1.ui.plaf.UIManager.getInstance(UIManager.java:126)
at com.codename1.ui.Component.getUIManager(Component.java:951)
at com.codename1.ui.Component.<init>(Component.java:722)
at com.codename1.ui.TextArea.<init>(TextArea.java:423)
at com.codename1.ui.TextArea.<init>(TextArea.java:298)
at com.codename1.ui.TextField.<init>(TextField.java:265)
at com.kcconsulting.soccersession.SoccerSession.<init>(SoccerSession.java:37)
at `your text`java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstruct`your text`orHandleAccessor.java:67)
at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
at java.base/java.lang.reflect.ReflectAccess.newInstance(ReflectAccess.java:128)
at `your text`java.base/jdk.internal.reflect.ReflectionFactory.newInstance(ReflectionFactory.java:304)
at java.base/java.lang.Class.newInstance(Class.java:685)
at com.codename1.impl.javase.Executor$3.run(Executor.java:266)
at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:773)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:720)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:714)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:400)
at `your text`java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Java Result: 1
这是我的应用程序设置:
package com.kcconsulting.soccersession;
import static com.codename1.ui.CN.*;
import com.codename1.ui.Display;
import com.codename1.ui.Form;
import com.codename1.ui.Container;
import com.codename1.ui.Dialog;
import com.codename1.ui.Label;
import com.codename1.ui.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;
import com.codename1.ui.layouts.BorderLayout;
import com.codename1.ui.layouts.Layout;
import com.codename1.io.NetworkEvent;
import com.codename1.ui.Image;
import com.codename1.ui.TextField;
import static com.codename1.ui.layouts.BorderLayout.centerEastWest;
import static com.codename1.ui.layouts.BoxLayout.Y_AXIS;
import com.codename1.ui.table.TableLayout;
/**
* This file was generated by <a href="https://www.codenameone.com/">Codename One</a> for the purpose
* of building native mobile applications using Java.
*/
public class SoccerSession {
private Form current = new Form();
private Resources theme;
private Label sessionLabel = new Label("Name");
public void init(Object context) {
// use two network threads instead of one
updateNetworkThreadCount(2);
theme = UIManager.initFirstTheme("/scr/css/theme.css");
// 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; }
Button r = new Button("Rondos");
Button p = new Button("Plays");
Button n = new Button("New");
Button s = new Button("Capture Screen");
Container headerContainer = new Container();
Container bodyContainer = new Container();
// Container sessionName = new Container(tl);
// String pathToImageSortBy = "soccersession/src/main/resources/WorkingField";
// Image bg = protected Image(Object image);
// bg = new Image(getClass().getClassLoader().getResource(pathToImageSortBy));
// bodyContainer.addImage(bg);
Container footerBar = new Container();
Container footerContainer = new Container();
Container leftPanel = new Container();
Container rightPanel = new Container();
// Container maincontainer = new Container(new BorderLayout());
BorderLayout forSession = new BorderLayout();
// forSession.setLayout(centerEastWest(sessionText, null, sessionLabel))
footerContainer.setLayout(new BorderLayout(centerEastWest(sessionText, null, sessionLabel)));
BoxLayout bl = new BoxLayout(Y_AXIS);
leftPanel.setLayout(bl);
rightPanel.setLayout(bl);
TableLayout tl = new TableLayout(1, 3);
footerBar.add(tl.createConstraint().widthPercentage(20).heightPercentage(100), n);
footerBar.add(tl.createConstraint().widthPercentage(60).heightPercentage(100), footerContainer);
footerBar.add(tl.createConstraint().widthPercentage(20).heightPercentage(100), s);
Form hi = new Form("Welcome to Soccer Session - Landscape Orientation", new BorderLayout());
hi.add(BorderLayout.CENTER, bodyContainer).
add(BorderLayout.SOUTH, footerBar).
add(BorderLayout.NORTH, headerContainer).
add(BorderLayout.EAST, rightPanel).
add(BorderLayout.WEST, leftPanel);
leftPanel.add(r);
leftPanel.add(p);
hi.show();
}
public void stop() {
current = getCurrentForm();
if(current instanceof Dialog) {
((Dialog)current).dispose();
current = getCurrentForm();
}
}
public void destroy() {
}
}
我很困惑为什么应用程序试图创建新字体,因为我还不需要它。我查看了 2 个论坛,但找不到任何 createFont 实例,尽管有一些空错误实例。 我是否需要逐一检查这 27 个实例,或者我可以在代码中更正这个问题吗?如果不使用模拟器,我就无法开始改变外观。谢谢。
我回答了这里复制供参考。
我假设
SoccerSession
是你的主要课程。请注意,您的代码位于该类的构造函数中。应该是 init(Object)
或 start()
方法。
字体始终存在,这是默认的系统字体。问题是,由于
init(Object)
尚未被调用,这意味着 Codename One 本身在此阶段尚未完成加载。实施本身还没有准备好。