打印对话框没有出现

esp*_*rio 5 java printing dialog javafx modal-dialog

通过JavaFx的PrinterJob可以调用Print Dialog.我的问题是,呼叫时的对话框没有出现.

这是我的例子:

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 );
  }
}
Run Code Online (Sandbox Code Playgroud)

第二个问题:框架不是模态的,因此可能导致错误.

信息:我使用Java 8_92.

And*_*LDM 5

可能是JDK-8088395描述的JavaFX的当前限制.

所以你有这些选择:

  1. 等待最终修复更新或JavaFX 9.
  2. 根据JDK-8098009的建议,为自己编写一个自定义对话框,然后与打印API进行通信以填充它.
  3. 使用叠加效果阻止场景,显示打印对话框,然后移除叠加层.您还需要在场景被阻止时阻止窗口关闭.
  4. 使用AWT打印对话框(kludge,你已经被警告过),例如:

 

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
});
Run Code Online (Sandbox Code Playgroud)