javafx 打开窗口没有效果应用程序启动然后抛出类未找到

问题描述

好的,所以要启动 javafx 应用程序,我们需要启动 javafx 应用程序。 然后,如果我们想添加一个新窗口,我们可以简单地执行 stageobj.show();对吗?

下面是我的代码的一部分,我试图创建新窗口。我已经启动了我的应用程序并想从我的应用程序中调用这个新代码

//imports all needed class

public String plugstart(){
        try{Application.launch();
        net.time4j.ui.javafx.CalendarPicker obj=net.time4j.ui.javafx.CalendarPicker.gregorianWithSystemDefaults();
        javafx.scene.Scene scn=new javafx.scene.Scene(obj,300,250);
        Stage stage = new Stage();
        stage.setTitle("Date pick test");//scn.getChildren().add(obj);
        stage.setScene(scn);
        stage.show();
        return "ok";}catch(Exception e){java.io.StringWriter sw = new java.io.StringWriter();
        java.io.PrintWriter pw =new java.io.PrintWriter(sw);
        e.printstacktrace(pw);return sw.toString();}
    }
    
// not sure if this function is useful or not
    @Override
    public void start(Stage stage) {
        try{Application.launch();
        net.time4j.ui.javafx.CalendarPicker obj=net.time4j.ui.javafx.CalendarPicker.gregorianWithSystemDefaults();
        javafx.scene.Scene scn=new javafx.scene.Scene(obj,250);
        stage.setTitle("Date pick test");//scn.getChildren().add(obj);
        stage.setScene(scn);
        stage.show();
        }catch(Exception e){}
    }

证明它编译完美。

:\Coding\JavaSourceCode\plugin\userareaplugin\otherpartylibderived\time4jtest>javac -cp ;D:\Coding\JavaSourceCode\plugin\userareaplugin\otherpartylibderived\time4jtest\*;D:\Coding\JavaSourceCode\plugin\userareaplugin\otherpartylibderived\time4jtest *.java

D:\Coding\JavaSourceCode\plugin\userareaplugin\otherpartylibderived\time4jtest>

好的,有什么问题吗?它应该可以正常工作?遗憾的是没有。 下图是堆栈跟踪。 show class not found

有人有类似的经历或解决方案吗?

edit1,好的,所以有人问了 java 版本,我不能评论

D:\Coding\JavaSourceCode\plugin\userareaplugin\otherpartylibderived\time4jtest>java -version openjdk version "15" 2020-09-15 OpenJDK Runtime Environment (build 15+36-1562) OpenJDK 64-Bit Server VM (build 15+36-1562,混合 模式,分享

JVM 抱怨 Testdategui.class 是的,这就是我应该有这个新阶段的班级。 注意它实际上已经在执行第 7 行,但仍然抱怨找不到类。@@

非常感谢

编辑2, 基于亲爱的 jetspiking 建议。 1,我试图确保没有两次启动应用程序。删除了启动废话。 2,确保它实际上使用javafx线程和javafx.application.Platform.runLater

walah,猜猜发生了什么?它实际上返回了“ok”。但是,ui 不在那里。(抽泣)

函数状态>

public String plugstart(){
        try{
        javafx.application.Platform.runLater(new Runnable(){public void run(){
            net.time4j.ui.javafx.CalendarPicker obj=net.time4j.ui.javafx.CalendarPicker.gregorianWithSystemDefaults();
            javafx.scene.Scene scn=new javafx.scene.Scene(obj,250);
        Stage stage = new Stage();
        stage.setTitle("Date pick test");//scn.getChildren().add(obj);
        stage.setScene(scn);
        stage.show();
            }});
        return "ok";}catch(Exception e){java.io.StringWriter sw = new java.io.StringWriter();
        java.io.PrintWriter pw =new java.io.PrintWriter(sw);
        e.printstacktrace(pw);return sw.toString();}
    }

好的,我尝试了解决方案并对其进行了调整。我认为它应该可以工作,但是我有 classnotfound 异常。

我认为这是我自己的类路径设置问题而不是回答问题,所以我会接受答案。

对于那些好奇的人,现在我有这个新错误。如果我使用“全新的类”。

:\Coding\JavaSourceCode\plugin\userareaplugin\otherpartylibderived\time4jtest\test3basedonSO_menoguide>java -cp %newcp%--module-path %newcp% --add-modules=all-modules Testdategui
Error: Could not find or load main class ;D:\Coding\JavaSourceCode\plugin\userareaplugin\otherpartylibderived\time4jtest\test3basedonSO_menoguide\*;D:\Coding\JavaSourceCode\plugin\userareaplugin\otherpartylibderived\time4jtest\test3basedonSO_menoguide
Caused by: java.lang.classNotFoundException: ;D:\Coding\JavaSourceCode\plugin\userareaplugin\otherpartylibderived\time4jtest\test3basedonSO_menoguide\*;D:\Coding\JavaSourceCode\plugin\userareaplugin\otherpartylibderived\time4jtest\test3basedonSO_menoguide

D:\Coding\JavaSourceCode\plugin\userareaplugin\otherpartylibderived\time4jtest\test3basedonSO_menoguide>

reference src,应该可以吗?但是我这边有问题

import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.application.Application;
public class Testdategui extends Application 
{
    
     @Override
    public void start(Stage primaryStage) throws Exception {
        // Launch all your JavaFX code and methods from inside this Entry Point function.
        Stage stage = new Stage();
        Scene scene = new Scene(net.time4j.ui.javafx.CalendarPicker.gregorianWithSystemDefaults());
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
    
}

编辑4,抱歉模块路径中没有空格而是新错误。我会尝试自己搜索答案

java -cp %newcp% --module-path %newcp% --add-modules=all-modules Testdategui 启动层初始化时出错 java.nio.file.InvalidpathException: Illegal char at index 104: D:\Coding\JavaSourceCode\plugin\userareaplugin\otherpartylibderived\time4jtest\test3basedonSO_menoguide*

最终编辑,worked.java -cp %newcp% --module-path %cd% --add-modules ALL-module-path Demo

谢谢。

解决方法

首先,您应该尝试创建一个简约的示例来找出问题所在。下次请考虑创建一个可重现的示例,以便社区可以更好地帮助(调试)。

当系统准备好开始运行应用程序时,在 JavaFX 应用程序线程上调用“start()”方法。你不能在这个线程之外做 JavaFX 的东西,这可能是你崩溃的原因。我读到您不确定“开始”是否有用,但出于这个原因绝对有必要。

您从哪里启动 plugstart 方法?如果它在您的 JavaFX 应用程序线程之外启动(因此当前在覆盖“start()”入口方法之外),应用程序将崩溃。

这是一个可重现的 JavaFX 应用程序示例。

package sample;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        // Launch all your JavaFX code and methods from inside this Entry Point function.
        Stage stage = new Stage();
        Scene scene = new Scene(new Label("I am a label object"));
        stage.setScene(scene);
        stage.show();
    }


    public static void main(String[] args) {
        launch(args);
    }
}

请注意,JavaFX 代码是从“start”方法内部启动的(因此舞台和场景是在那里创建的,等等),而不是从您的“main”方法中启动。当您希望 JavaFX 应用程序启动时,您只需从 main 方法调用一次“launch(args)”。

您说您已经启动了该应用程序,大概是从 main 方法启动的。为什么您尝试在“start”和“plugstart”方法中启动它?这肯定会导致崩溃,特别是因为在调用“start”方法时它已经在运行。