Sef*_*fel 7 java printing javafx
我正在使用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();
}
}
Run Code Online (Sandbox Code Playgroud)
我没有\xe2\x80\x99t 答案,但我会尝试解释为什么会发生这种情况以及为什么它不容易修复。此行为似乎受到 Internet 打印协议 (IPP) 规范的影响,并且是由 Java 打印服务 API(JavaFX 打印作业委托给它)实现 IPP 的方式引起的。以下是 Oracle\xe2\x80\x99s 技术说明的片段,解释了手动设置纸张来源的局限性 ( https://docs.oracle.com/javase/8/docs/technotes/guides/jps/spec/attributes)。 fm5.html):
\n\n\n介质是标识打印介质的 IPP 属性。Media属性是一个需要理解的重要属性,但相对复杂。
\nJava Print Service API 定义了抽象类 Media 的三个子类,以反映 IPP 规范中重载的 Media 属性:MediaSizeName、MediaName 和 MediaTray。所有Media子类都有Media类别,每个子类定义了不同的标准属性值。[\xe2\x80\xa6]
\nMedia 属性的值始终是 String,但由于该属性是重载的,因此其值决定了该属性引用的媒体类型。例如,IPP预定义的一组属性值包括值“a4”和“top-tray”。如果“介质”设置为值“a4”,则“介质”属性指的是纸张尺寸,但如果“介质”设置为“顶部托盘”,则“介质”属性指的是纸张来源。[\xe2\x80\xa6]
\n在大多数情况下,应用程序将使用 MediaSizeName 或 MediaTray。MediaSizeName 类按大小枚举媒体。MediaTray 类枚举打印机上的纸盘,通常包括主纸盘和手动进纸盘。IPP 1.1 规范未规定同时指定介质尺寸和介质托盘,这意味着应用程序无法从手动托盘请求 A4 尺寸纸张。IPP 规范的未来修订版可能会提供一种一次请求多种类型媒体的方法,在这种情况下,JPS API 很可能会得到增强以实现此更改。
\n
因此,MediaTray(或纸张来源)不是一个独立的参数,如果该Media属性已通过其他两种方式之一定义(MediaSizeName或MediaName)之一定义,则无法设置。这正是页面设置对话框中发生的情况。
J2DPrinterJob类(来自com.sun.prism.j2d.print包)包含对话框代码并更新打印作业设置(我通过调试您的应用程序发现了这一点)。下面是此类中的方法,用于从对话框中更新纸张来源设置。
private void updatePaperSource() {\n Media m = (Media)printReqAttrSet.get(Media.class);\n if (m instanceof MediaTray) {\n PaperSource s = j2dPrinter.getPaperSource((MediaTray)m);\n if (s != null) {\n settings.setPaperSource(s);\n }\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n我测试了不同的场景,结果是相同的:在updatePaperSource()开始执行时Media,属性已经定义为MediaSizeName类型。因此 if 分支中的语句永远不会被执行,这就是为什么论文源没有更新的原因。
我怀疑纸张类型或纸张尺寸优先于纸张来源,并且由于页面设置对话框始终定义纸张类型(没有 \xe2\x80\x98Automatic\xe2\x80\x99 选项),因此它会重载纸张来源的选择避免属性冲突。这本质上使得这个选项毫无用处。
\n这可能是 JDK 中的错误或有意的设计决策。无论如何,考虑到它来自 Java\xe2\x80\x99s 内部 API 中的私有方法,我在 JavaFX 中看不到解决此问题的简单方法。
\n| 归档时间: |
|
| 查看次数: |
593 次 |
| 最近记录: |