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