在应用程序类之外使用javafx生成图形?
我真的很喜欢javafx用于渲染2D图形的方式,并且我已经围绕着用它制作图表构建了一个完整的类。我已经成功地创建了在应用程序类之外使用javafx生成图形?,java,javafx,Java,Javafx,我真的很喜欢javafx用于渲染2D图形的方式,并且我已经围绕着用它制作图表构建了一个完整的类。我已经成功地创建了窗格对象的png,这样我就可以在本地保存它,以后再显示它 我遇到的问题是,当我想在一个扩展JavaFX应用程序的类之外使用我的绘图类时(更具体地说,我想让它成为库的一部分,库支持输出渲染图形的png。但作为一个库,创建UI似乎效率不高。) 有效的东西: 构建图形对象(创建窗格,执行初始图形工作,无错误) 调用将Arcs添加到图形窗格的类方法 破裂的东西: 调用将文本添加到窗格的
窗格
对象的png,这样我就可以在本地保存它,以后再显示它
我遇到的问题是,当我想在一个扩展JavaFX应用程序的类之外使用我的绘图类时(更具体地说,我想让它成为库的一部分,库支持输出渲染图形的png。但作为一个库,创建UI似乎效率不高。)
有效的东西:
- 构建图形对象(创建窗格,执行初始图形工作,无错误)
- 调用将
Arc
s添加到图形窗格的类方法
破裂的东西:
- 调用将文本添加到窗格的类方法(在
新文本(“”
声明时失败)。堆栈跟踪:
当我在扩展应用程序的类的start()
方法中创建对象时,可以在对象创建之后调用所有这些类方法。但并非如此
事实上,如果我必须在应用程序类中生成图像,那么它到底是如何工作的?我创建了一个类的实例,但它需要以某种方式运行…?这与应用程序
类无关。RuntimeException
表示,在使用其图形系统之前,您需要确保JavaFX工具包已初始化。启动JavaFX至少有三种方法:(1)应用程序启动(…)
,(2)平台启动(()->…)
,以及(3)新建JFXPanel()。您的非法状态异常
不同;这意味着工具包已初始化,但您的线程错误。您可以使用Platform.runLater(()->…)
@Slaw调度FX线程上的操作。我确实尝试过使用Application.launch()
,但我似乎无法传递包含渲染最终图形所需的所有数据的对象。你能告诉我如何在javaFX中使用后两种方法吗?我的google fu让我找不到好的例子。谢谢首先,你的实际目标是什么?这是一个具有用户与之交互的UI的应用程序吗?或者您正在尝试创建一个“不可见”地呈现图形的应用程序。@abg出于您的目的,Platform.startup(()->…)变体可能是更相关的,但不要忘记,您只能调用一次。在第一次调用之后,您必须使用Platform.runLater(()->…)。@Slaw我正在尝试创建一个库/API,主要部分是它所做的计算,但作为辅助功能,我需要数据的图形输出,以便“不可见地”渲染精确到我想要的。我还需要能够将生成的信息传递到javafx应用程序中。这似乎是我遇到最多麻烦的地方。这与应用程序
类无关。RuntimeException
表示,在使用其图形系统之前,您需要确保JavaFX工具包已初始化。启动JavaFX至少有三种方法:(1)应用程序启动(…),(2)平台启动(()->…),以及(3)新建JFXPanel()。您的非法状态异常
不同;这意味着工具包已初始化,但您的线程错误。您可以使用Platform.runLater(()->…)
@Slaw调度FX线程上的操作。我确实尝试过使用Application.launch()
,但我似乎无法传递包含渲染最终图形所需的所有数据的对象。你能告诉我如何在javaFX中使用后两种方法吗?我的google fu让我找不到好的例子。谢谢首先,你的实际目标是什么?这是一个具有用户与之交互的UI的应用程序吗?或者您正在尝试创建一个“不可见”地呈现图形的应用程序。@abg出于您的目的,Platform.startup(()->…)变体可能是更相关的,但不要忘记,您只能调用一次。在第一次调用之后,您必须使用Platform.runLater(()->…)。@Slaw我正在尝试创建一个库/API,主要部分是它所做的计算,但作为辅助功能,我需要数据的图形输出,以便“不可见地”渲染精确到我想要的。我还需要能够将生成的信息传递到javafx应用程序中。那似乎是我遇到最多麻烦的地方。
java.lang.RuntimeException: Internal graphics not initialized yet
at com.sun.glass.ui.Screen.getScreens(Screen.java:70)
at com.sun.glass.ui.Screen.getMainScreen(Screen.java:61)
at com.sun.javafx.font.PrismFontFactory.getSystemFontSize(PrismFontFactory.java:1876)
at com.sun.javafx.font.PrismFontLoader.getSystemFontSize(PrismFontLoader.java:241)
at javafx.scene.text.Font.getDefaultSystemFontSize(Font.java:71)
at javafx.scene.text.Font.getDefault(Font.java:86)
at javafx.scene.text.Text.getFont(Text.java:478)
at javafx.scene.text.Text.getFontInternal(Text.java:487)
at javafx.scene.text.Text.getTextLayout(Text.java:226)
at javafx.scene.text.Text.needsFullTextLayout(Text.java:184)
at javafx.scene.text.Text.access$200(Text.java:95)
at javafx.scene.text.Text$2.invalidated(Text.java:389)
at javafx.beans.property.StringPropertyBase.markInvalid(StringPropertyBase.java:109)
at javafx.beans.property.StringPropertyBase.set(StringPropertyBase.java:144)
at javafx.beans.property.StringPropertyBase.set(StringPropertyBase.java:49)
at javafx.scene.text.Text.setText(Text.java:370)
at javafx.scene.text.Text.<init>(Text.java:129)
at io.dreadylocks.astrojava.drawing.ChartDraw.addPlanets(ChartDraw.java:211)
at io.dreadylocks.astrojava.Chart.generateChartImage(Chart.java:192)
at io.dreadylocks.astrojava.MainTest.main(MainTest.java:15)
java.lang.IllegalStateException: Not on FX application thread; currentThread = main
at com.sun.javafx.tk.Toolkit.checkFxUserThread(Toolkit.java:279)
at com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(QuantumToolkit.java:444)
at javafx.scene.Node.snapshot(Node.java:1928)
at io.dreadylocks.astrojava.drawing.ChartDraw.toPng(ChartDraw.java:220)
at io.dreadylocks.astrojava.MainTest.main(MainTest.java:15)