javafx open window no effect.application launch with then throw class not found

javafx open window no effect.application launch with then throw class not found

好的,为了启动 javafx 应用程序,我们需要启动 javafx 应用程序。 那么如果我们想添加一个新的 window 我们可以简单地做 stageobj.show();对吧?

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

//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, 300, 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, mixed mode, sharing)

jvm 正在抱怨 Testdategui.class 是的,这就是应该有这个新舞台的classi。 注意它实际上已经执行了第 7 行,但仍然抱怨 class not found。@@

非常感谢

编辑2, 基于亲爱的 jetspiking 建议。 1,我试图确保没有启动应用程序 twice.removed 启动废话。 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, 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();}
    }

好的,我尝试了解决方案并进行了调整 it.I 认为它应该有效,但是我有 classnotfound 异常。

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

对于那些好奇的人,现在我有这个新的 error.if 我使用“全新的 class”。

:\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,抱歉,模块路径中没有 space,但新的 error.I 将尝试自己搜索答案

java -cp %newcp% --module-path %newcp% --add-modules=all-modules Testdategui Error occurred during initialization of boot layer 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 应用程序启动时,您只需从主方法调用一次“launch(args)”。

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