Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javafx不';无法检测可用打印机的更改_Java_Dynamic_Javafx_Printing - Fatal编程技术网

Javafx不';无法检测可用打印机的更改

Javafx不';无法检测可用打印机的更改,java,dynamic,javafx,printing,Java,Dynamic,Javafx,Printing,我正在开发一个JavaFX应用程序,它涉及打印机。但我需要创建一个更新按钮,以便应用程序可以在应用程序运行时检测最近创建或删除的打印机(断开或连接) System.out.println("Print services: " + printServices.length); for (PrintService printer : printServices) System.out.println("Printer: " + printer.getName()); 附言: Print

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

System.out.println("Print services: " + printServices.length);

for (PrintService printer : printServices)
    System.out.println("Printer: " + printer.getName()); 
附言:
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
}
public void updateAvailablePrinters(){
printers=FXCollections.observearraylist();
ObservableSet allPrinters=Printer.getAllPrinters();
allPrinters.forEach(printer->printers.add(printer));//printers是一个字段变量
}
来自类别的API文档:

因为打印机的可用性可能会在执行过程中发生变化 一个程序,由于管理行为,一个长期运行的程序 缓存了已脱机的打印机,可能会创建 使用该实例的作业,但打印将失败

因此,在JavaFX中似乎没有简单的实现方法。您可以做的是,尝试打印并查看PrintJob.JobStatus,如果失败,打印机将脱机或不再安装。之后,您可以选择其他打印机。

您可以尝试使用
javax.print.PrintServiceLookup
而不是JavaFX
打印机来显示可用的打印机服务

我刚刚使用了下面的代码片段来获取可用打印机的列表,它似乎在
应用程序运行时检测添加/删除的打印机

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();
    }
}

你有错误代码的样本吗?它是否会抛出任何错误(例如,要共享的堆栈跟踪)?@HEADLESS\u 0NE添加了代码示例这是一个很好的解决方案,但效率很高,假设我在选项屏幕中,然后按下“更新”按钮并完成您的解决方案,那么打印机可能会打印一些东西,如果它已连接并联机。@AbdElraoufSabri没有一个好的解决方案。读取可用打印机是一种本机方法,因此取决于操作系统。因此,印刷将得到不同的对待。在Windows中,您得到了一个打印队列,每个作业都将被调度,即使打印机实际未连接。因此,在您的情况下,用户应该能够像在其他应用程序中一样手动选择(活动)打印机。好的,谢谢。显然,我要删除更新按钮,因为它没有用:)showPrintDialog的问题是,它不会显示打印机是否在线。