Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX2:HeadlessException在使用java.awt.print.PrinterJob.printDialog()时_Java_Macos_Printing_Javafx 2 - Fatal编程技术网

JavaFX2:HeadlessException在使用java.awt.print.PrinterJob.printDialog()时

JavaFX2:HeadlessException在使用java.awt.print.PrinterJob.printDialog()时,java,macos,printing,javafx-2,Java,Macos,Printing,Javafx 2,我使用java.awt.print.PrinterJob.printDialog()在javafx应用程序中启动printDialog。 在os-x上运行时,我总是从printDialog()方法获得java.awt.HeadlessException 我已经读到javafx8支持自己的打印对话框,但不幸的是,我无法在这个项目中切换到javafx8 有什么办法解决这个问题吗 同时发布了JavaFX8,我们将项目切换到JavaFX8,并使用PrinterJob=PrinterJob.createP

我使用java.awt.print.PrinterJob.printDialog()在javafx应用程序中启动printDialog。 在os-x上运行时,我总是从printDialog()方法获得java.awt.HeadlessException

我已经读到javafx8支持自己的打印对话框,但不幸的是,我无法在这个项目中切换到javafx8


有什么办法解决这个问题吗

同时发布了JavaFX8,我们将项目切换到JavaFX8,并使用
PrinterJob=PrinterJob.createPrinterJob()

有了这个新的FX8打印功能,AWT在创建打印作业时不再使用->无头异常

编辑:我终于找到了AWT Java FX的变通方法,我不久前找到了,但现在找不到了:


我个人会尝试将AWT部分外包给另一个VM方法,我已经编写了一个小类,它可以从JavaFX应用程序打开AWT打印对话框。 我已经用JDK1.8测试过了,所以我不知道它对您的情况是否有帮助。 如果没有,请告诉我,然后我将使用JDK1.7进行调查。
[UPDATE]我还在Mac OS X 10.9.3上的JDK1.7(集成了JavaFX2.2)上使用它


import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.text.Font;
import javafx.scene.text.Text;

import javax.swing.*;

/**
 * Created by el on 27.05.14.
 */
public class PrintFx {
    private static void initAndShowGUI() {
        // This method is invoked on the EDT thread
        JFrame frame = new JFrame("Swing and JavaFX");
        final JFXPanel fxPanel = new JFXPanel();
        frame.add(fxPanel);
        frame.setSize(300, 200);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Platform.runLater(new Runnable() {
            @Override
            public void run() {
                initFX(fxPanel);
            }
        });
    }

    private static void initFX(JFXPanel fxPanel) {
        // This method is invoked on the JavaFX thread
        Scene scene = createScene();
        fxPanel.setScene(scene);
    }

    private static Scene createScene() {
        Group root = new Group();
        Scene scene = new Scene(root, javafx.scene.paint.Color.ALICEBLUE);
        Text text = new Text();

        text.setX(40);
        text.setY(100);
        text.setFont(new Font(25));
        text.setText("Welcome JavaFX!");

        //A button with the specified text caption.
        javafx.scene.control.Button button2 = new javafx.scene.control.Button("Open AWT print dialog");
        button2.setOnAction(new EventHandler() {
            @Override public void handle(ActionEvent e) {
                SwingUtilities.invokeLater(new Runnable() {
                    @Override
                    public void run() {
                        System.out.println("now open dialog!");
                        java.awt.print.PrinterJob.getPrinterJob().printDialog();
                    }
                });
            }
        });

        root.getChildren().add(text);
        root.getChildren().add(button2);

        return (scene);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                initAndShowGUI();
            }
        });
    }
}

我正在处理一个Spring Boot+JavaFX项目,这个问题发生在AWT和JavaFX
PrinterJob上。[show]printDialog()
,因为系统属性
java.AWT.headless
默认为true

这就是我能够解决的问题:

System.setProperty("java.awt.headless", "false");

如何创建打印机作业?来自
HeadlessException
的文档:“当在不支持键盘、显示器或鼠标的环境中调用依赖于键盘、显示器或鼠标的代码时抛出。”您是否在其他环境中进行过测试,并且只在OS-X上发生过,或者OS-X是您测试过的唯一环境?此问题仅与OSX相关。据我所知,JavaFX7在OSX中以无头模式初始化AWT。我在谷歌上搜索了一些解决这个问题的方法,没有一个对我有效。谢谢你更新@elnin0,但是我们无法切换到JavaFX 8,正在等待另一个答案。我已经用解决方法更新了我的答案,我发现这个方法对我来说很有效。谢谢。我假设这是因为为AWT部件打开了新线程而起作用的?没错,printDialog()只能从EDT(负责AWT操作的线程)调用。不会启动额外的线程,EDT已经运行,可运行的只是一个将由EDT执行的“任务”。