更改用户模式时出错 Gluon Mobile

问题描述

在我的 gluon Mobile 项目中,我希望允许用户从亮模式切换到暗模式。但是,正如我通过堆栈问题发现的:Allowing user to switch between light and dark mode Gluon,我需要通过 getScene() 方法访问场景。一切正常,直到我尝试将用户首选项保存在每个用户会话的数据文件中;它不再起作用。我不仅收到错误(见下文),而且也没有显示正确的用户首选项(它只显示认值,直到我使用应用程序内按钮更改它)。目标是让用户能够按下应用内按钮来更改模式,并在用户下次打开应用时自动显示该模式。我知道这是我的项目的一个特定问题,可能不适合 Stack Overflow,但我不知道我还能如何解决这个问题。因此,如果有人可以帮助我,我将不胜感激。我几乎完成了我的应用程序,我有点时间紧迫。非常感谢您抽出宝贵时间,我期待着您的回音。 附注如果您需要此项目的 GitHub 存储库链接,请告诉我。

正在会话类中保存的布尔灯(模式指示器)的(相关部分)代码

public class Session implements Serializable {
/**
 * Data field: userid       user name 
 * Data field: password     user password 
 * Data field: date         the date and time the session started 
 * Data field: feeling1     mood (1..100) of user at the beginning of session
 * Data field: feeling2     mood (1..100) of user at the end of session 
 * Data field: conversation sentences expressed by the user during a session
 */
private String userid = "";
private String password = "";
    private boolean light = true;
private Date date = new Date();
private Date time = new Date();
private double feeling1 = 0;
private double feeling2 = 0;
private ArrayList<String> conversation = new ArrayList<>();
private ArrayList<String> times = new ArrayList<>();

private static final long serialVersionUID = 2L;

/**
 * The only constructor: It receives a user's id and password 
 * and starts a session associated with the user. It records
 * the date and time the session started.
 * 
 * @param id   user id
 * @param pass user password
 */
public Session(String id,String pass) {
    userid = id;
    password = pass;
            
    date = new Date();
}

    
    /**
 * Reset mode of user for this session: The method receives a mode (light or dark)  
 * and replaces current mode with the received mode.
 * 
 * @param dark the new mode
 */
public void setMode(boolean dark) {
    light = dark;
}

/**
 * Get mode (light or dark) of the user for this session
 * 
 * @return mode of user for this session
 */
public boolean getMode() {
    return light;
}

PrimaryView 类中给我错误代码

// Use a GridPane to create a login interface insights 
    VBox grid = new VBox();
    //grid.setStyle("-fx-background-color: black;");
    grid.setAlignment(Pos.CENTER);
    Insets snI = new Insets(10,10,10);
    grid.setPadding(snI);

    Button button = new Button();
    grid.getChildren().add(button);
    if (session.getMode() == true) {
        light = true;
        
        LIGHT.assignTo(grid.getScene()); // ERROR IS POINTING TO THIS LINE
        button.setGraphic(new Icon(MaterialDesignIcon.BRIGHTnesS_2));
    } else if (session.getMode() == false) {
        light = false;
        
        DARK.assignTo(grid.getScene());
        button.setGraphic(new Icon(MaterialDesignIcon.WB_SUNNY));
    }

错误本身:

Exception in thread "JavaFX Application Thread" java.lang.NullPointerException: Scene cannot be null
at java.base/java.util.Objects.requireNonNull(Objects.java:246)
at com.gluonhq.impl.charm.glisten.util.StylesheetTools.replaceStylesheet(StylesheetTools.java:64)
at com.gluonhq.charm.glisten.visual.Theme.assignTo(Theme.java:34)
at com.mysecondapplication.views.PrimaryView.homeScreen(PrimaryView.java:276)
at com.mysecondapplication.views.PrimaryView.lambda$new$0(PrimaryView.java:183)
at javafx.base/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:234)
at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at javafx.base/com.sun.javafx.event.CompositeEventdispatcher.dispatchBubblingEvent(CompositeEventdispatcher.java:59)
at javafx.base/com.sun.javafx.event.BasicEventdispatcher.dispatchEvent(BasicEventdispatcher.java:58)
at javafx.base/com.sun.javafx.event.EventdispatchChainImpl.dispatchEvent(EventdispatchChainImpl.java:114)
at javafx.base/com.sun.javafx.event.BasicEventdispatcher.dispatchEvent(BasicEventdispatcher.java:56)
at javafx.base/com.sun.javafx.event.EventdispatchChainImpl.dispatchEvent(EventdispatchChainImpl.java:114)
at javafx.base/com.sun.javafx.event.BasicEventdispatcher.dispatchEvent(BasicEventdispatcher.java:56)
at javafx.base/com.sun.javafx.event.EventdispatchChainImpl.dispatchEvent(EventdispatchChainImpl.java:114)
at javafx.base/com.sun.javafx.event.BasicEventdispatcher.dispatchEvent(BasicEventdispatcher.java:56)
at javafx.base/com.sun.javafx.event.EventdispatchChainImpl.dispatchEvent(EventdispatchChainImpl.java:114)
at javafx.base/com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at javafx.base/com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
at javafx.base/javafx.event.Event.fireEvent(Event.java:198)
at javafx.graphics/javafx.scene.Node.fireEvent(Node.java:8889)
at javafx.controls/javafx.scene.control.Button.fire(Button.java:203)
at javafx.controls/com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:208)
at javafx.controls/com.sun.javafx.scene.control.inputmap.InputMap.handle(InputMap.java:274)
at javafx.base/com.sun.javafx.event.CompositeEventHandler$normalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:247)
at javafx.base/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:234)
at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at javafx.base/com.sun.javafx.event.CompositeEventdispatcher.dispatchBubblingEvent(CompositeEventdispatcher.java:59)
at javafx.base/com.sun.javafx.event.BasicEventdispatcher.dispatchEvent(BasicEventdispatcher.java:58)
at javafx.base/com.sun.javafx.event.EventdispatchChainImpl.dispatchEvent(EventdispatchChainImpl.java:114)
at javafx.base/com.sun.javafx.event.BasicEventdispatcher.dispatchEvent(BasicEventdispatcher.java:56)
at javafx.base/com.sun.javafx.event.EventdispatchChainImpl.dispatchEvent(EventdispatchChainImpl.java:114)
at javafx.base/com.sun.javafx.event.BasicEventdispatcher.dispatchEvent(BasicEventdispatcher.java:56)
at javafx.base/com.sun.javafx.event.EventdispatchChainImpl.dispatchEvent(EventdispatchChainImpl.java:114)
at javafx.base/com.sun.javafx.event.BasicEventdispatcher.dispatchEvent(BasicEventdispatcher.java:56)
at javafx.base/com.sun.javafx.event.EventdispatchChainImpl.dispatchEvent(EventdispatchChainImpl.java:114)
at javafx.base/com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at javafx.base/com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
at javafx.base/javafx.event.Event.fireEvent(Event.java:198)
at javafx.graphics/javafx.scene.Scene$MouseHandler.process(Scene.java:3856)
at javafx.graphics/javafx.scene.Scene.processMouseEvent(Scene.java:1851)
at javafx.graphics/javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2584)
at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:409)
at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:299)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$2(GlassViewEventHandler.java:447)
at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:412)
at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:446)
at javafx.graphics/com.sun.glass.ui.View.handleMouseEvent(View.java:556)
at javafx.graphics/com.sun.glass.ui.View.notifyMouse(View.java:942)
at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
at java.base/java.lang.Thread.run(Thread.java:834)

编辑:我做了一些测试,打印出场景既不亮也不暗?我很困惑。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)