2016-07-20 15 views
2

Ich entwickle eine JavaFX-Anwendung, die Drucker betrifft. Aber ich muss eine Aktualisierungsschaltfläche erstellen, damit die Anwendung kürzlich erstellte oder gelöschte Drucker (getrennt oder verbunden) erkennt, während die Anwendung ausgeführt wird.JavaFX erkennt keine Änderungen der verfügbaren Drucker

PS:

Printer.getAllPrinters() bekommt, was ich will, aber es muss die Anwendung vor dem Erfassen von Änderungen neu gestartet werden, was bedeutet, dass meine Update-Button nutzlos ist.

bearbeiten 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 Sie haben ein Beispiel für den fehlerhaften Code? Werden irgendwelche Fehler (d. H. Eine zu teilende Stapelüberwachung) ausgegeben? –

+1

@ HEADLESS_0NE hinzugefügt Code Beispiele –

Antwort

1

Sie könnten versuchen, lookupPrintServices method von javax.print.PrintServiceLookup anstelle von JavaFX Printer zu verwenden, um die verfügbaren Druckerdienste anzuzeigen.

Ich habe gerade das folgende Snippet verwendet, um die Liste der verfügbaren Drucker zu erhalten, und es scheint, dass hinzugefügte/entfernte Drucker erkannt werden, während Application ausgeführt wird.

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

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

Oder wenn Sie nur die Benutzer in der Lage wählen Sie einen Drucker vor dem eigentlichen Druck machen wollen, Sie showPrintDialog von PrinterJob wie im Dialog der Druckerliste aktualisiert wird, auch verwenden:

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

Das Problem mit showPrintDialog ist, dass es nicht anzeigt, ob ein Drucker online ist. – NwDev

+0

@DVarga, das ist die Lösung, die ich brauche. Danke vielmals :) –

1

Von der API-Doc von Printer Klasse:

Da die Verfügbarkeit von Druckern während der Ausführung von ein Programm, aufgrund von administrativen Maßnahmen ändern kann, ein lang laufende Programm, das einen Drucker zwischengespeichert hat, der seitdem offline genommen wurde, kann einen Job erstellen, der diese Instanz verwendet, aber das Drucken wird fehlschlagen.

So scheint es, dass es in JavaFX keine einfache Möglichkeit gibt, es zu tun. Versuchen Sie, PrintJob.JobStatus zu drucken und anzusehen. Wenn der Drucker fehlschlägt, ist der Drucker offline oder nicht mehr installiert. Danach können Sie einen anderen Drucker auswählen.

+0

Eine gute Problemumgehung, aber in effizienter, sagen wir, ich bin in Optionen Bildschirm und dann die Update-Taste gedrückt ist und Ihre Problemumgehung dann Der Drucker möglicherweise etwas gedruckt, wenn es verbunden ist und online. –

+0

@AbdElraoufSabri Es gibt keine gute Problemumgehung. Lesen verfügbar Drucker ist eine native Methode, also abhängig vom Betriebssystem. So wird das Drucken anders behandelt. In Windows haben Sie eine PrintQueue, in der jeder Job eingeplant wird, auch wenn der Drucker gerade nicht verbunden ist. In diesem Fall sollte der Benutzer den (aktiven) Drucker wie in anderen Anwendungen manuell auswählen können. – NwDev

+0

ok danke. Offenbar werde ich die Update-Schaltfläche entfernen, da es nutzlos ist :) –