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

时间:2013-12-02 10:35:12

标签: java macos printing javafx-2

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

我已经读过javafx8支持自己的printdialogs但不幸的是我在这个项目中无法切换到javafx8。

任何想法如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

我写了一个小类,它从JavaFX应用程序打开AWT打印对话框。 我用JDK 1.8测试了这个,所以我不知道它对你的情况有帮助。 如果没有,请告诉我,然后我会用JDK 1.7进行调查。
[更新]我也在Mac OS X 10.9.3上使用JDK1.7(带有集成的JavaFx 2.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();
            }
        });
    }
}

答案 1 :(得分:1)

在此期间发布了Java FX8,我们将项目切换到JavaFX8并使用PrinterJob job = PrinterJob.createPrinterJob(); http://docs.oracle.com/javase/8/javafx/api/javafx/print/PrinterJob.html

使用这种新的FX8打印功能,在创建打印作业时不再使用AWT - >没有无头的例外。

编辑:我终于找到了AWT的解决方法< - >我前段时间发现的Java FX再也找不到它了: JavaFX screencapture headless exception on OSX

我个人会尝试将AWT部件外包到另一个VM方法

答案 2 :(得分:0)

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

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

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