Javafx未检测到可用打印机的更改

时间:2016-07-20 00:29:44

标签: java dynamic javafx printing

我正在开发一个涉及打印机的JavaFX应用程序。但是我需要创建一个更新按钮,以便应用程序可以在应用程序运行时检测最近创建或删除的打印机(断开连接或已连接)。

PS:

Printer.getAllPrinters()得到我想要的但是它需要在检测到更改之前重新启动应用程序,这意味着我的更新按钮没用。

编辑1:

public void updateAvailablePrinters() {
    printers = FXCollections.observableArrayList();
    ObservableSet<Printer> allPrinters = Printer.getAllPrinters();
    allPrinters.forEach(printer -> printers.add(printer)); // printers is a field variable
}

2 个答案:

答案 0 :(得分:1)

来自Printer课程的API-Doc:

  

由于打印机的可用性可能会在执行期间发生变化   一个程序,由于行政行为,一个长期运行的程序   已经缓存了一台打印机,该打印机已经脱机,可能会创建一个   使用该实例的作业,但打印失败。

所以似乎在JavaFX中没有简单的方法。你可以做的是,尝试打印并观看PrintJob.JobStatus,如果失败,打印机离线或不再安装。之后,您可以选择其他打印机。

答案 1 :(得分:1)

您可以尝试使用javax.print.PrintServiceLookup Printer代替JavaFX Application来显示可用的打印机服务。

我刚刚使用以下代码段获取可用打印机列表,它似乎在System.out.println("Print services: " + printServices.length); for (PrintService printer : printServices) System.out.println("Printer: " + printer.getName()); 正在运行时检测到添加/删除的打印机。

PrinterJob

或者,如果您只是想让用户在实际打印之前选择打印机,您可以使用PrinterJob job = PrinterJob.createPrinterJob(); if (job != null && job.showPrintDialog(stage)){ boolean success = job.printPage(stage.getScene().getRoot()); if (success) { job.endJob(); } } {{1}},因为对话框中的打印机列表也会刷新:

{{1}}