问题描述
好的,所以要启动 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”方法时它已经在运行。