2016-04-11 1 views
4

Ich versuche, Text an einen Drucker zu senden. Ich brauche nur den Text gedruckt, um den Seitenrand gewickelt und bei Bedarf zu einer anderen Seite fließen.Wie drucke ich nur Text?

Hier ist ein minimales Beispiel dafür, was ich jetzt tue:

@FXML 
private void print() { 
    TextArea printArea = new TextArea(textArea.getText()); 
    printArea.setWrapText(true); 
    printArea.getChildrenUnmodifiable().forEach(node -> node.setStyle("-fx-background-color: transparent")); 
    printArea.setStyle("-fx-background-color: transparent"); 

    PrinterJob printerJob = PrinterJob.createPrinterJob(); 

    if (printerJob != null && printerJob.showPrintDialog(textArea.getScene().getWindow())) { 
     if (printerJob.printPage(printArea)) { 
      printerJob.endJob(); 
      // done printing 
     } else { 
      // failed to print 
     } 
    } else { 
     // failed to get printer job or failed to show print dialog 
    } 
} 

Was Druck endet ist ein grauer Hintergrund, dass die Steuerung selbst, zusammen mit dem Scrollbar zu sein scheint. Komme ich dem in die falsche Richtung? Ich habe das Gefühl, dass ich gegen die API ankämpfe, indem ich ein Steuerelement anpasse und drucke, anstatt einfach den zu druckenden Text zu senden.

Das Beispielbild unten wurde von meiner Handykamera aufgenommen, so dass das Whitepaper ein bisschen hellgrau aussieht, aber Sie können immer noch den grauen Hintergrund von der Steuerung und der Bildlaufleiste sehen.

example image of print result

Antwort

3

Statt eines TextArea-, drucken Sie eine TextFlow:

private void print() { 
    TextFlow printArea = new TextFlow(new Text(textArea.getText())); 

    PrinterJob printerJob = PrinterJob.createPrinterJob(); 

    if (printerJob != null && printerJob.showPrintDialog(textArea.getScene().getWindow())) { 
     PageLayout pageLayout = printerJob.getJobSettings().getPageLayout(); 
     printArea.setMaxWidth(pageLayout.getPrintableWidth()); 

     if (printerJob.printPage(printArea)) { 
      printerJob.endJob(); 
      // done printing 
     } else { 
      System.out.println("Failed to print"); 
     } 
    } else { 
     System.out.println("Canceled"); 
    } 
} 

Beachten Sie, dass die Textflow des maxWidth eingestellt werden muss, um das Seitenlayout des Printer verwenden, nachdem der Druckdialog angezeigt wurde.