我的应用程序是基于Swing的.我想介绍JavaFX并将其配置为在辅助显示器上呈现场景.我可以使用JFrame来保存一个可以容纳JFXPanel的JFXPanel,但我想用JavaFX API实现这个目的.
子类化com.sun.glass.ui.Application并使用Application.launch(this)不是一个选项,因为调用线程将被阻止.
从Swing EDT实例化一个舞台时,我得到的错误是:
java.lang.IllegalStateException: Toolkit not initialized
Run Code Online (Sandbox Code Playgroud)
有什么指针吗?
编辑:结论
问题:非平凡的Swing GUI应用程序需要运行JavaFX组件.应用程序的启动过程在启动从属服务层后初始化GUI.
解决方案
子类JavaFX Application类并在单独的线程中运行它,例如:
public class JavaFXInitializer extends Application {
@Override
public void start(Stage stage) throws Exception {
// JavaFX should be initialized
someGlobalVar.setInitialized(true);
}
}
Run Code Online (Sandbox Code Playgroud)
旁注:因为Application.launch()方法接受一个Class<? extends Application>
参数,所以必须使用全局变量来表示JavaFX环境已被初始化.
替代方法:在Swing Event Dispatcher Thread中实例化JFXPanel:
final CountDownLatch latch = new CountDownLatch(1);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new JFXPanel(); // initializes JavaFX environment
latch.countDown();
}
});
latch.await();
Run Code Online (Sandbox Code Playgroud)
通过使用此方法,调用线程将等待,直到设置JavaFX环境.
选择您认为合适的解决方案.我选择了第二个,因为它不需要一个全局变量来表示JavaFX环境的初始化,也不会浪费一个线程.
我正在研究JavaFX应用程序,在我的场景中是显示在JavaFX中创建的密码提示,它带有两个选项的密码OK
和Cancel
.我已经返回了用户输入的密码.
我的密码对话框是 -
public static String showPasswordDialog(String title, String message, Stage parentStage, double w, double h) {
try {
Stage stage = new Stage();
PasswordDialogController controller = (PasswordDialogController) Utility.replaceScene("Password.fxml", stage);
passwordDialogController.init(stage, message, "/images/password.png");
if (parentStage != null) {
stage.initOwner(parentStage);
}
stage.initModality(Modality.WINDOW_MODAL);
stage.initStyle(StageStyle.UTILITY);
stage.setResizable(false);
stage.setWidth(w);
stage.setHeight(h);
stage.showAndWait();
return controller.getPassword();
} catch (Exception ex) {
return null;
}
Run Code Online (Sandbox Code Playgroud)
我的代码显示密码提示的位置如下,实际上这个提示将显示在其他UI上,所以我需要将其包含在内部Platform.runlater()
,否则它会抛出Not on FX application thread
.我需要这个密码提示才能显示,直到我得到正确的密码提示.如果我在runlater中显示密码,我怎样才能获得密码值.
还有其他更好的方法吗?
final String sPassword = null;
do {
Platform.runLater(new Runnable() { …
Run Code Online (Sandbox Code Playgroud) 目前我正在研究Jax Rs应用程序,我想将Base64编码的图像输出到客户端.客户端是移动设备.
移动设备将使用一些参数调用此服务,服务器必须绘制条形图并将其作为base64编码的图像字符串发送回设备.
由于java Fx具有所需的图表库,我使用以下教程做了一个示例."快照"功能也按预期正常工作(创建屏幕图像).
http://docs.oracle.com/javafx/2/charts/bar-chart.htm#CIHJFHDE
现在我想在不扩展Application类的情况下这样做,因为我需要在Jax Rs应用程序中使用它.这样我就可以使用api创建一个BuffredImage然后用它来创建Base64字符串.
我找到了一种使用JFreeChart做到这一点的方法.但我更喜欢我能用Java FX做到这一点.我没有任何Java Fx的经验
请指教
是否可以在无头模式下运行JavaFx(在Java 7中)?它用于在服务器上生成图像,但是要求使用X-Server.在JavaFx中是否存在类似java.awt.headless的东西?(我不能使用Xvfb)
您好我正在使用JavaFx WebView创建HTML页面的屏幕截图,它工作正常,但我想知道是否可以这样做而无需在图形Windows中启动应用程序!我的意思是没有更多的轻量级方法来获取截图然后这个:
public class WebViewSample extends Application {
private Scene scene;
@Override
public void start(Stage stage) {
// create scene
scene = new Scene(new Browser(snapshot), 750, 500, Color.web("#666970"));
stage.setScene(scene);
// show stage
stage.show();
}
WritableImage snapshot;
public static void main(String[] args) {
launch(args);
System.err.println("launched!");
}
}
class Browser extends Region {
final ImageView selectedImage = new ImageView();
final WebView browser = new WebView();
final WebEngine webEngine = browser.getEngine();
private final WritableImage snapshotImage;
public Browser(WritableImage snapshot) {
this.snapshotImage= snapshot;
// process …
Run Code Online (Sandbox Code Playgroud)