JavaFX PrintAPI错误的PaperSource
|
我正在使用 JavaFx Print-Dialog来自定义打印作业.所有属性都将存储在PrinterJob#JobSettings变量中,但是当我从jobSetting接收纸张来源时,纸张来源始终是默认值. 如何获得我设置的纸张来源? 这是一个简短的例子: public class PrinterPaperSourceTest extends Application {
public static void main(String[] args) {
launch( args );
}
@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("Printer");
Button btn = new Button();
btn.setText("Show Printer Settings ");
btn.setOnAction( new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
PrinterJob job = PrinterJob.createPrinterJob(Printer.getDefaultPrinter());
job.showPageSetupDialog(null);
Alert alert = new Alert(AlertType.INFORMATION);
PaperSource paperSource = job.getJobSettings().getPaperSource();
alert.setContentText("PaperSource: " + paperSource.getName());
alert.show();
}
});
StackPane root = new StackPane();
root.getChildren().add(btn);
primaryStage.setScene(new Scene(root,300,250));
primaryStage.show();
}
}
解决方法我没有答案,但我会尝试解释它为什么会发生以及为什么它不容易修复.此行为似乎受Internet打印协议(IPP)规范的影响,并且是由Java Print Service API(JavaFX打印作业委托给它)实现IPP的方式引起的.以下是Oracle技术说明中的一个片段,解释了手动设置纸张来源的限制( https://docs.oracle.com/javase/8/docs/technotes/guides/jps/spec/attributes.fm5.html):
因此,MediaTray(或纸张来源)不是独立参数,如果Media属性已经由其他两种方式之一(MediaSizeName或MediaName)定义,则无法设置.这正是页面设置对话框所发生的情况. J2DPrinterJob类(来自com.sun.prism.j2d.print包)包含对话框代码并更新打印作业设置(我通过调试您的应用程序找到了这个).以下是此类中从对话框更新纸张来源设置的方法. private void updatePaperSource() {
Media m = (Media)printReqAttrSet.get(Media.class);
if (m instanceof MediaTray) {
PaperSource s = j2dPrinter.getPaperSource((MediaTray)m);
if (s != null) {
settings.setPaperSource(s);
}
}
}
我测试了不同的场景,结果是一样的:当updatePaperSource()开始执行时,Media属性已经被定义为MediaSizeName类型.所以if分支中的语句永远不会被执行,这就是为什么纸质来源没有更新的原因. 我怀疑纸张类型或纸张尺寸优先于纸张来源,并且因为页面设置对话框始终定义纸张类型(没有“自动”选项),它会使纸张来源的选择超载,以避免属性冲突.这实际上使这个选项无用. 它可能是JDK中的错误或有意的设计决策.无论如何,考虑到它来自Java内部API中的私有方法,我没有看到解决JavaFX中这个问题的简单方法. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
