3

好的,所以要启动 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, 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>

好的,有什么问题吗?它应该可以正常工作吗?遗憾的是没有。下图是堆栈跟踪。 找不到显示类

谁有类似的经验或解决方案?

编辑1,好的,所以有人询问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 行,但仍然抱怨找不到类。@@

非常感谢

edit2,基于亲爱的 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, 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();}
    }

好的,我尝试了解决方案并对其进行了调整。我认为它应该可以工作,但是我有 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>

参考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

谢谢你。

4

1 回答 1

1

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

当系统准备好让应用程序开始运行时,在 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”方法时它已经在运行。

于 2021-01-23T10:21:06.387 回答