从主方法将Javafx图表作为实例启动时出错
我在从另一个类获取Javafx图表时遇到问题。在主方法中创建类的实例时,例如:从主方法将Javafx图表作为实例启动时出错,java,charts,javafx,Java,Charts,Javafx,我在从另一个类获取Javafx图表时遇到问题。在主方法中创建类的实例时,例如: Charts c = new Charts(); 以下代码导致以下运行时错误 Exception in Application constructor java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.Nat
Charts c = new Charts();
以下代码导致以下运行时错误
Exception in Application constructor
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:367)
at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:305)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
Caused by: java.lang.RuntimeException: Unable to construct Application instance: class Charts
at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:884)
at com.sun.javafx.application.LauncherImpl.access$000(LauncherImpl.java:56)
at com.sun.javafx.application.LauncherImpl$1.run(LauncherImpl.java:158)
at java.lang.Thread.run(Thread.java:744)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
at com.sun.javafx.application.LauncherImpl$7.run(LauncherImpl.java:791)
at com.sun.javafx.application.PlatformImpl$7.run(PlatformImpl.java:335)
at com.sun.javafx.application.PlatformImpl$6$1.run(PlatformImpl.java:301)
at com.sun.javafx.application.PlatformImpl$6$1.run(PlatformImpl.java:298)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl$6.run(PlatformImpl.java:298)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
Caused by: java.lang.IllegalStateException: Application launch must not be called more than once
at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:137)
at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:118)
at javafx.application.Application.launch(Application.java:241)
at Charts.<init>(Charts.java:50)
... 11 more
Exception running application Charts
请问有谁能帮助纠正这种情况吗?我相信这个问题可能是由于在Charts方法中使用launch而没有提供具体的参数
import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.scene.Scene;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.stage.Stage;
public class Charts extends Application {
@Override
public void start(Stage stage) {
stage.setTitle("Line Chart Sample");
// defining the axes
final NumberAxis xAxis = new NumberAxis();
final NumberAxis yAxis = new NumberAxis();
xAxis.setLabel("Number of Month");
// creating the chart
final LineChart<Number, Number> lineChart = new LineChart<Number, Number>(
xAxis, yAxis);
lineChart.setTitle("Stock Monitoring, 2010");
// defining a series
XYChart.Series series = new XYChart.Series();
series.setName("My portfolio");
// populating the series with data
series.getData().add(new XYChart.Data(1, 23));
series.getData().add(new XYChart.Data(2, 14));
series.getData().add(new XYChart.Data(3, 15));
series.getData().add(new XYChart.Data(4, 24));
series.getData().add(new XYChart.Data(5, 34));
series.getData().add(new XYChart.Data(6, 36));
series.getData().add(new XYChart.Data(7, 22));
series.getData().add(new XYChart.Data(8, 45));
series.getData().add(new XYChart.Data(9, 43));
series.getData().add(new XYChart.Data(10, 17));
series.getData().add(new XYChart.Data(11, 29));
series.getData().add(new XYChart.Data(12, 25));
Scene scene = new Scene(lineChart, 800, 600);
lineChart.getData().add(series);
stage.setScene(scene);
stage.show();
}
public Charts() {
launch();
}
}
这不是启动JavaFX应用程序的受支持方式。如果没有堆栈跟踪,我无法告诉您它失败的确切细节。launch方法将为您实例化应用程序类的新实例,启动JavaFX子系统,并执行start。。。方法你应该考虑一下开始…方法是应用程序中的入口点事实上,在Java8中,您可以从命令行启动应用程序子类,即使它没有主。。。方法 如果您想让您的Charts类可重用,以便可以从不同的位置启动它,可以将其作为可以放置在场景中的某个对象的子类,或者为其提供这样一个对象的访问器方法。Application的子类有一个特定的函数作为JavaFX应用程序的启动类 例如 然后您可以创建应用程序类,这些应用程序类使用
public class MyChartApp extends Application {
@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("My chart app");
Charts c = new Charts();
Scene scene = new Scene(c.getContent(), 800, 600);
primaryStage.setScene(scene);
primaryStage.show();
}
}
您可以添加一些实用方法,例如
public Scene createScene() {
return new Scene(content, 800, 600);
}
及
如果您想/需要,请转到Charts类
那当然是你的开始。。。方法可以简化为
public void start(Stage primaryStage) {
new Charts().configureStage(primaryStage);
primaryStage.show();
}
另外,Applicationlaunch创建一个单独的JavaFX线程,每个VM只允许一个实例,因此在构造函数内调用launch将抛出java.lang.IllegalStateException:如果OP使用图表作为主应用程序条目,则不能多次调用Application launch。但我知道他还有其他的切入点:公共类Main{publicstaticvoidmainstring[]args{newcharts;}。但也许我错过了什么。无论如何这不是办法,谢谢你。我仍然在实现和运行代码方面存在问题,而代码不是来自主类。问题是,如果您的类是应用程序的子类,那么它就是您的主类。要从另一个类调用的任何代码都应该位于不是应用程序子类的类中。例如,不要从其他任何地方调用launch。如果你仍然有问题,要么更新你的问题,要么发布一个新的问题。
public void configureStage(Stage stage) {
stage.setScene(createScene());
}
public void start(Stage primaryStage) {
new Charts().configureStage(primaryStage);
primaryStage.show();
}