2016-07-20 4 views
2

Я разрабатываю приложение JavaFX, которое включает в себя принтеры. Но мне нужно сделать кнопку обновления, чтобы приложение могло обнаруживать недавно созданные или удаленные принтеры (отключенные или подключенные) во время работы приложения.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 
} 
+0

Do у вас есть образец неисправного кода? Выбрасывает ли он какие-либо ошибки (т. Е. Трассировка стека для обмена)? –

+1

@ HEADLESS_0NE добавлены образцы кода –

ответ

1

Вы можете попытаться использовать lookupPrintServices method из javax.print.PrintServiceLookup вместо JavaFX Printer, чтобы отобразить доступные службы принтера.

Я просто использовал следующий фрагмент, чтобы получить список доступных принтеров, и, похоже, он обнаруживает добавленные/удаленные принтеры во время работы Application.

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

for (PrintService printer : printServices) 
    System.out.println("Printer: " + printer.getName()); 

Или если вы просто хотите, чтобы пользователю возможность выбрать принтер до фактической печати, вы можете использовать showPrintDialog из PrinterJob, как в диалоговом окне список принтеров также обновляется:

PrinterJob job = PrinterJob.createPrinterJob(); 
if (job != null && job.showPrintDialog(stage)){ 
    boolean success = job.printPage(stage.getScene().getRoot()); 
    if (success) { 
     job.endJob(); 
    } 
} 
+1

Проблема с showPrintDialog заключается в том, что он не показывает, находится ли принтер в сети. – NwDev

+0

@DVarga, это решение, в котором я нуждаюсь. большое спасибо :) –

1

Из API-РОУ Printer класса:

Поскольку наличие принтеров может изменяться во время выполнения программы, из-за административные меры, то которая кэшировала принтер, который с тех пор был снят с линии, может создать задание с использованием этого экземпляра, но печать завершится неудачно.

Поэтому кажется, что в JavaFX нет простого способа сделать это. Что вы можете сделать, попробуйте распечатать и посмотреть PrintJob.JobStatus, если он не работает, принтер больше не подключен или не установлен. После этого вы можете выбрать другой принтер.

+0

Хорошее обходное решение, но в эффективном, скажем, я на экране параметров, а затем нажата кнопка обновления и сделана обходной путь. Принтер может что-то распечатать, если он подключен и подключен к сети. –

+0

@AbdElraoufSabri Не существует обходного пути. Чтение доступно Принтеры - это собственный метод, поэтому он зависит от ОС. Таким образом, печать будет обрабатываться по-разному. В Windows вы получили PrintQueue, каждый из которых будет назначен, даже если принтер не подключен. Таким образом, возможно, в вашем случае пользователь должен иметь возможность выбирать (активный) принтер вручную, как в других приложениях. – NwDev

+0

ОК спасибо. Поэтому, видимо, я собираюсь удалить кнопку обновления, поскольку это бесполезно :) –

Смежные вопросы