2016-04-25 32 views
5

Mit PrinterJob von JavaFx kann der Druckdialog aufgerufen werden. Mein Problem ist, dass der Dialog beim Anruf nicht in den Vordergrund tritt.Der Druckdialog wird nicht angezeigt

Hier ist mein Beispiel:

import javafx.application.Application; 
import javafx.print.Printer; 
import javafx.print.PrinterJob; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.input.KeyCode; 
import javafx.scene.input.KeyEvent; 
import javafx.scene.layout.BorderPane; 
import javafx.stage.Stage; 

public class Printexample extends Application 
{ 

    @Override 
    public void start(final Stage primaryStage) 
    { 

    final PrinterJob job = PrinterJob.createPrinterJob(Printer.getDefaultPrinter()); 
    final Button b = new Button("Print Dialog"); 
    b.setOnAction(event -> job.showPrintDialog(primaryStage)); 
    final BorderPane pane = new BorderPane(b); 
    primaryStage.setMinWidth(400); 
    primaryStage.setMinHeight(300); 
    primaryStage.setTitle("Print"); 
    final Scene scene = new Scene(pane); 
    primaryStage.setScene(scene); 


    primaryStage.centerOnScreen(); 
    primaryStage.addEventFilter(KeyEvent.KEY_PRESSED, event -> 
    { 
     if (event.getCode().equals(KeyCode.ESCAPE)) 
     { 
     primaryStage.close(); 
     } 
    }); 
    primaryStage.show(); 

    } 

    public static void main(final String[] args) 
    { 
    launch(args); 
    } 
} 

Das zweite Problem: Der Rahmen ist nicht modal, daher kann es zu Fehlern führt.

Information: Ich benutze Java 8_92.

Antwort

4

Wahrscheinlich eine Strombegrenzung von JavaFX wie JDK-8088395 beschrieben.

So haben Sie folgende Optionen:

  1. Warten Sie diese schließlich in einem Update oder JavaFX fixiert werden 9.
  2. selbst einen benutzerdefinierten Dialog schreiben und dann mit den Druck APIs kommunizieren um es zu füllen, wie vorgeschlagen in JDK-8098009.
  3. Blockieren Sie Ihre Szene mit einem Overlay, zeigen Sie den Druckdialog an und entfernen Sie dann das Overlay. Sie müssen auch verhindern, dass das Fenster geschlossen wird, während die Szene blockiert ist.
  4. Verwenden AWT Print Dialog (Flickschusterei, haben Sie gewarnt), z.B .:

 

java.awt.print.PrinterJob printJob = PrinterJob.getPrinterJob(); 
Button b = new Button("Print Dialog"); 
b.setOnAction(event -> { 
    JFrame f = new JFrame(); 
    printJob.printDialog(); 
    // Stage will be blocked(non responsive) until the printDialog returns 
});