JavaFX Print API
Detta är ett JavaFX-utskriftsexempel. JavaFX lade till stöd för utskrift av noder genom Print API i javafx.print
paket. API:t består av följande klasser:
- Skrivare
- Skrivarattribut
- Utskriftsupplösning
- Skrivarjobb
- Jobbinställningar
- Papper
- PaperSource
- Sidlayout
- Sidintervall
Förekomster av de ovan angivna klasserna representerar olika delar av utskriftsprocessen. Till exempel representerar en skrivare en skrivare som kan användas för utskriftsjobb. Ett PrinterJob representerar ett utskriftsjobb som kan skickas till en Printer
för utskrift. Och ett papper representerar pappersstorlekarna som är tillgängliga på skrivare.
Print-API:et ger stöd för att skriva ut noder som kan vara kopplade till en scengraf eller inte.
Om en nod modifieras under utskriftsprocessen kanske den utskrivna noden inte visas korrekt. Observera att utskriften av en nod kan sträcka sig över flera pulshändelser vilket resulterar i samtidiga förändringar i innehållet som skrivs ut. För att säkerställa korrekt utskrift, se till att Node
som skrivs ut ändras inte under utskriftsprocessen.
Noder kan skrivas ut på vilken tråd som helst, inklusive JavaFX Application Thread. Det rekommenderas att stora, tidskrävande utskriftsjobb skickas i en bakgrundstråd för att hålla användargränssnittet responsivt.
Klasser i Print API är slutgiltiga eftersom de representerar befintliga utskriftsenhetsegenskaper. De flesta av dem tillhandahåller ingen offentlig konstruktör eftersom du inte kan skapa en utskriftsenhet. Istället får du deras referenser med hjälp av fabriksmetoder i olika klasser.
Följande tabell visar en översikt över hela artikeln:
Innehållsförteckning
- 1. Lista över tillgängliga skrivare
- 1.1 Koden
- 1.2 GUI
- 2. Hämta standardskrivaren
- 2.1 Koden
- 2.2 GUI
- 3. Utskrift av noder
- 3.1 Koden
- 3.2 GUI
- 4. Visar sidinställningarna
- 4.1 Koden
- 4.2 GUI
- 5. Visar utskriftsdialogrutorna
- 5.1 Koden
- 5.2 GUI
- 6. Anpassa inställningar för skrivarjobb
- 6.1 Koden
- 6.2 GUI
- 7. Ställa in sidlayout
- 7.1 Koden
- 7.2 GUI
- 8. Ladda ner Java-källkod
Följande exempel använder Java SE 8 och JavaFX 2.2.
1. Lista över tillgängliga skrivare
1.1 Koden
FxPrintExample1.java
import javafx.application.Application; import javafx.collections.ObservableSet; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.print.Printer; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.TextArea; import javafx.scene.layout.VBox; import javafx.stage.Stage; public class FxPrintExample1 extends Application { public static void main(String[] args) { Application.launch(args); } @Override public void start(Stage stage) { // Create the TextArea final TextArea textArea = new TextArea(); // Create the Button Button button = new Button("Get all Printers"); // Create the Event-Handlers for the Buttons button.setOnAction(new EventHandler <ActionEvent>() { public void handle(ActionEvent event) { //Get all Printers ObservableSet<Printer> printers = Printer.getAllPrinters(); for(Printer printer : printers) { textArea.appendText(printer.getName()+"\n"); } } }); // Create the VBox with a 10px spacing VBox root = new VBox(10); // Add the Children to the VBox root.getChildren().addAll(button,textArea); // Set the Size of the VBox root.setPrefSize(400, 250); // Set the Style-properties of the VBox root.setStyle("-fx-padding: 10;" + "-fx-border-style: solid inside;" + "-fx-border-width: 2;" + "-fx-border-insets: 5;" + "-fx-border-radius: 5;" + "-fx-border-color: blue;"); // Create the Scene Scene scene = new Scene(root); // Add the scene to the Stage stage.setScene(scene); // Set the title of the Stage stage.setTitle("Showing all Printers"); // Display the Stage stage.show(); } }
Printer.getAllPrinters()
statisk metod returnerar en observerbar lista över installerade skrivare på maskinen. Observera att listan över skrivare som returneras av metoden kan ändras med tiden när nya skrivare installeras eller gamla skrivare tas bort. Använd getName()
metod för Printer
för att få namnet på skrivaren.
Följande kodavsnitt listar alla installerade skrivare på maskinen som kör koden. Du kan få en annan utdata.
//Get all Printers ObservableSet<Printer> printers = Printer.getAllPrinters(); for(Printer printer : printers) { textArea.appendText(printer.getName()+"\n"); }
1.2 GUI
Följande GUI visar en lista över alla skrivare:
Visar alla skrivare med JavaFX Print API
2. Hämta standardskrivaren
2.1 Koden
FxPrintExample2.java
import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.print.Printer; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.TextArea; import javafx.scene.layout.VBox; import javafx.stage.Stage; public class FxPrintExample2 extends Application { public static void main(String[] args) { Application.launch(args); } @Override public void start(Stage stage) { // Create the TextArea final TextArea textArea = new TextArea(); // Create the Button Button button = new Button("Get the Default Printer"); // Create the Event-Handlers for the Buttons button.setOnAction(new EventHandler <ActionEvent>() { public void handle(ActionEvent event) { //Get the Default Printer Printer defaultprinter = Printer.getDefaultPrinter(); if (defaultprinter != null) { String name = defaultprinter.getName(); textArea.appendText("Default printer name: " + name); } else { textArea.appendText("No printers installed."); } } }); // Create the VBox with a 10px spacing VBox root = new VBox(10); // Add the Children to the VBox root.getChildren().addAll(button,textArea); // Set the Size of the VBox root.setPrefSize(400, 250); // Set the Style-properties of the VBox root.setStyle("-fx-padding: 10;" + "-fx-border-style: solid inside;" + "-fx-border-width: 2;" + "-fx-border-insets: 5;" + "-fx-border-radius: 5;" + "-fx-border-color: blue;"); // Create the Scene Scene scene = new Scene(root); // Add the scene to the Stage stage.setScene(scene); // Set the title of the Stage stage.setTitle("Show the default Printer"); // Display the Stage stage.show(); } }
Printer.getDefaultPrinter()
metod returnerar standardvärdet Printer
. Metoden kan returnera null om ingen skrivare är installerad. Standardskrivaren kan ändras på en maskin. Därför kan metoden returnera olika skrivare från samtal till samtal, och skrivaren som returneras kanske inte är giltig efter en tid.
Följande kodavsnitt visar hur man får standard Printer
.
//Get the Default Printer Printer defaultprinter = Printer.getDefaultPrinter(); if (defaultprinter != null) { String name = defaultprinter.getName(); textArea.appendText("Default printer name: " + name); } else { textArea.appendText("No printers installed."); }
2.2 GUI
Följande bild visar standardskrivaren. I det här fallet är det en CutePDF Writer.
Skaffa standardskrivaren med JavaFX Print API
3. Utskrift av noder
3.1 Koden
FxPrintExample3.java
import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.print.PrinterJob; import javafx.scene.Node; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.TextArea; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import javafx.stage.Stage; public class FxPrintExample3 extends Application { // Create the JobStatus Label private Label jobStatus = new Label(); public static void main(String[] args) { Application.launch(args); } @Override public void start(Stage stage) { // Create the VBox final VBox root = new VBox(5); // Create the Text Label Label textLabel = new Label("Please insert your Text:"); // Create the TextArea final TextArea textArea = new TextArea(); // Create the Buttons Button printTextButton = new Button("Print Text"); Button printSceneButton = new Button("Print Scene"); // Create the Event-Handlers for the Buttons printTextButton.setOnAction(new EventHandler <ActionEvent>() { public void handle(ActionEvent event) { print(textArea); } }); printSceneButton.setOnAction(new EventHandler <ActionEvent>() { public void handle(ActionEvent event) { print(root); } }); // Create the Status Box HBox jobStatusBox = new HBox(5, new Label("Job Status: "), jobStatus); // Create the Button Box HBox buttonBox = new HBox(5, printTextButton, printSceneButton); // Add the Children to the VBox root.getChildren().addAll(textLabel, textArea, buttonBox, jobStatusBox); // Set the Size of the VBox root.setPrefSize(400, 300); // Set the Style-properties of the VBox root.setStyle("-fx-padding: 10;" + "-fx-border-style: solid inside;" + "-fx-border-width: 2;" + "-fx-border-insets: 5;" + "-fx-border-radius: 5;" + "-fx-border-color: blue;"); // Create the Scene Scene scene = new Scene(root); // Add the scene to the Stage stage.setScene(scene); // Set the title of the Stage stage.setTitle("A Printing Nodes Example"); // Display the Stage stage.show(); } private void print(Node node) { // Define the Job Status Message jobStatus.textProperty().unbind(); jobStatus.setText("Creating a printer job..."); // Create a printer job for the default printer PrinterJob job = PrinterJob.createPrinterJob(); if (job != null) { // Show the printer job status jobStatus.textProperty().bind(job.jobStatusProperty().asString()); // Print the node boolean printed = job.printPage(node); if (printed) { // End the printer job job.endJob(); } else { // Write Error Message jobStatus.textProperty().unbind(); jobStatus.setText("Printing failed."); } } else { // Write Error Message jobStatus.setText("Could not create a printer job."); } } }
Skriver ut en Node
är lätt. Skapa en PrinterJob
och ring dess printPage()
metod som skickar Node
ska skrivas ut.
Detaljerna i följande kodavsnitt kommer att diskuteras i nästa meningar.
// Create a printer job for the default printer PrinterJob job = PrinterJob.createPrinterJob(); if (job != null) { // Show the printer job status jobStatus.textProperty().bind(job.jobStatusProperty().asString()); // Print the node boolean printed = job.printPage(node); if (printed) { // End the printer job job.endJob(); } else { // Write Error Message jobStatus.textProperty().unbind(); jobStatus.setText("Printing failed."); } } else { // Write Error Message jobStatus.setText("Could not create a printer job."); }
Du kan använda createPrinterJob()
statisk metod för PrinterJob
klass för att skapa ett skrivarjobb:
- offentlig statisk PrinterJob createPrinterJob()
- offentlig statisk PrinterJob createPrinterJob(Skrivarskrivare)
Metoden med no-args skapar ett skrivarjobb för standardskrivaren. Du kan använda den andra versionen av metoden för att skapa ett skrivarjobb för den angivna skrivaren.
Du kan byta skrivare mot en PrinterJob
genom att anropa dess setPrinter()
metod. Om de aktuella skrivarjobbinställningarna inte stöds av den nya skrivaren, återställs inställningarna automatiskt för den nya skrivaren.
Ställa in Printer
till null för jobbet kommer att använda standardskrivaren. Använd en av följande printPage()
metoder för att skriva ut en Node
:
- boolean printPage(nodnod)
- boolean printPage(PageLayout pageLayout, Nod node)
Den första versionen av metoden tar endast noden som ska skrivas ut som parameter. Den använder standard sidlayout för jobbet för utskrift.
Den andra versionen låter dig ange en sidlayout för utskrift av Node
. Den angivna sidlayouten kommer att åsidosätta PageLayout
för jobbet och det kommer endast att användas för att skriva ut den angivna noden. För efterföljande utskrift, standard PageLayout
för jobbet kommer att användas. Du kan skapa en PageLayout
med Printer
klass.
printPage()
metod returnerar sant om utskriften lyckades. Annars returnerar det falskt. När du är klar med utskriften ringer du endJob()
metod. Metoden returnerar sant om jobbet kan spoolas till skrivarkön. Annars returnerar det falskt, vilket kan indikera att jobbet inte kunde spoolas eller att det redan var slutfört. Efter framgångsrikt slutförande av jobbet kan jobbet inte längre återanvändas.
Du kan avbryta ett utskriftsjobb med cancelJob()
metod för PrinterJob
. Utskriften får inte avbrytas omedelbart, till exempel när en sida är mitt i utskriften. Avbokningen sker så snart som möjligt. Metoden har ingen effekt om,
- Jobbet har redan begärts att avbrytas.
- Jobbet är redan slutfört.
- Det finns ett fel i jobbet.
En PrinterJob
har en skrivskyddad status, som definieras av en av konstanterna för PrinterJob.JobStatus
enum:
- INTE_STARTAD
- UTSKRIFT
- AVSTÄLLD
- KLAR
- FEL
NOT_STARTED
status indikerar ett nytt jobb. I denna status kan jobbet konfigureras och utskrift kan påbörjas. PRINTING
status indikerar att jobbet har begärt att skriva ut minst en sida och att utskriften inte har avslutats. I denna status kan jobbet inte konfigureras.
De andra tre statuserna, CANCELED
, DONE
och ERROR
, anger jobbets avslutningsstatus. När jobbet är i en av dessa statusar ska det inte återanvändas. Du behöver inte ringa endJob()
metod när statusen går till CANCELED
eller ERROR
. DONE
status anges när utskriften lyckades och endJob()
metoden kallades. Klassen PrinterJob innehåller en skrivskyddad jobStatus
egenskap som anger aktuell status för utskriftsjobbet.
3.2 GUI
GUI för ovanstående program visar hur man skriver ut noder. Den visar ett TextArea där du kan skriva in text.
Två knappar tillhandahålls:en skriver ut TextArea
noden och den andra hela scenen. När utskriften påbörjas visas utskriftsjobbets status i en etikett.
Skriva ut en nod eller text med JavaFX Print API
När du har tryckt på knappen Print, visas följande dialogruta:
Välja fildestination för utskriftsjobbet med JavaFX Print API
Nu kan du definiera platsen och namnet på dokumentet.
4. Visar sidinställningarna
4.1 Koden
FxPrintExample4.java
import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.print.PrinterJob; import javafx.scene.Node; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.TextArea; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import javafx.stage.Stage; public class FxPrintExample4 extends Application { // Create the JobStatus Label private final Label jobStatus = new Label(); public static void main(String[] args) { Application.launch(args); } @Override public void start(final Stage stage) { // Create the Text Label Label textLabel = new Label("Please insert your Text:"); // Create the TextArea final TextArea textArea = new TextArea(); // Create the Buttons Button pageSetupButton = new Button("Page Setup and Print"); // Create the Event-Handlers for the Button pageSetupButton.setOnAction(new EventHandler <ActionEvent>() { public void handle(ActionEvent event) { pageSetup(textArea, stage); } }); // Create the Status Box HBox jobStatusBox = new HBox(5, new Label("Job Status: "), jobStatus); // Create the Button Box HBox buttonBox = new HBox(pageSetupButton); // Create the VBox VBox root = new VBox(5); // Add the Children to the VBox root.getChildren().addAll(textLabel, textArea, buttonBox, jobStatusBox); // Set the Size of the VBox root.setPrefSize(400, 300); // Set the Style-properties of the VBox root.setStyle("-fx-padding: 10;" + "-fx-border-style: solid inside;" + "-fx-border-width: 2;" + "-fx-border-insets: 5;" + "-fx-border-radius: 5;" + "-fx-border-color: blue;"); // Create the Scene Scene scene = new Scene(root); // Add the scene to the Stage stage.setScene(scene); // Set the title of the Stage stage.setTitle("A Printing Dialog Example"); // Display the Stage stage.show(); } private void pageSetup(Node node, Stage owner) { // Create the PrinterJob PrinterJob job = PrinterJob.createPrinterJob(); if (job == null) { return; } // Show the page setup dialog boolean proceed = job.showPageSetupDialog(owner); if (proceed) { print(job, node); } } private void print(PrinterJob job, Node node) { // Set the Job Status Message jobStatus.textProperty().bind(job.jobStatusProperty().asString()); // Print the node boolean printed = job.printPage(node); if (printed) { job.endJob(); } } }
Print API tillåter användare att interagera med utskriftsprocessen. Användare kan ändra skrivarinställningarna interaktivt innan utskriften påbörjas. API:et låter dig visa dialogrutorna Utskriftsinställningar och Utskriftsinställningar för att ställa in sidegenskaper och skrivarinställningar för jobbet.
Du kan låta användaren konfigurera sidlayouten genom att visa en dialogruta för sidinställningar. Använd showPageSetupDialog(Window owner)
metod för PrinterJob
för att visa en dialogruta för sidinställningar. Användaren kan ställa in sidstorlek, källa, orientering och marginal. Dialogrutan kan tillåta användaren att komma åt andra utskriftsegenskaper såsom listan över skrivare.
När användaren har bekräftat inställningarna i dialogrutan visas PrinterJob
har de nya inställningarna. Metoden returnerar true om användaren bekräftar inställningarna i dialogrutan. Den returnerar falskt om användaren avbryter dialogrutan. Den returnerar också false om dialogrutan inte kan visas, till exempel när jobbet inte finns i NOT_STARTED
stat.
Ägarparametern till metoden är fönstret som kommer att vara ägare till dialogrutan. Det kan vara null. Om det anges kommer ingångarna till fönstret att blockeras medan dialogrutan visas.
Följande kodavsnitt visar hur man skapar en PageSetupDialog
:
// Create the PrinterJob PrinterJob job = PrinterJob.createPrinterJob(); if (job == null) { return; } // Show the page setup dialog boolean proceed = job.showPageSetupDialog(owner); if (proceed) { print(job, node); }
4.2 GUI
Följande bild visar ett exempel på dialogrutan Sidinställningar:
Definition av sidinställningarna med JavaFX Print API
Efter att ha tryckt på Utskriftsformat och Skriv ut Button
, kommer följande dialogruta att visas:
Definition av sidinställningarna med JavaFX Print API
Nu kan du definiera formatet och andra attribut.
5. Visar utskriftsdialogrutorna
5.1 Koden
FxPrintExample5.java
import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.print.PrinterJob; import javafx.scene.Node; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.TextArea; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import javafx.stage.Stage; public class FxPrintExample5 extends Application { // Create the JobStatus Label private final Label jobStatus = new Label(); public static void main(String[] args) { Application.launch(args); } @Override public void start(final Stage stage) { // Create the Text Label Label textLabel = new Label("Please insert your Text:"); // Create the TextArea final TextArea textArea = new TextArea(); // Create the Buttons Button printSetupButton = new Button("Print Setup and Print"); // Create the Event-Handlers for the Button printSetupButton.setOnAction(new EventHandler () { public void handle(ActionEvent event) { printSetup(textArea, stage); } }); // Create the Status Box HBox jobStatusBox = new HBox(5, new Label("Job Status: "), jobStatus); // Create the Button Box HBox buttonBox = new HBox(printSetupButton); // Create the VBox VBox root = new VBox(5); // Add the Children to the VBox root.getChildren().addAll(textLabel, textArea, buttonBox, jobStatusBox); // Set the Size of the VBox root.setPrefSize(400, 300); // Set the Style-properties of the VBox root.setStyle("-fx-padding: 10;" + "-fx-border-style: solid inside;" + "-fx-border-width: 2;" + "-fx-border-insets: 5;" + "-fx-border-radius: 5;" + "-fx-border-color: blue;"); // Create the Scene Scene scene = new Scene(root); // Add the scene to the Stage stage.setScene(scene); // Set the title of the Stage stage.setTitle("A Printing Dialog Example"); // Display the Stage stage.show(); } private void printSetup(Node node, Stage owner) { // Create the PrinterJob PrinterJob job = PrinterJob.createPrinterJob(); if (job == null) { return; } // Show the print setup dialog boolean proceed = job.showPrintDialog(owner); if (proceed) { print(job, node); } } private void print(PrinterJob job, Node node) { // Set the Job Status Message jobStatus.textProperty().bind(job.jobStatusProperty().asString()); // Print the node boolean printed = job.printPage(node); if (printed) { job.endJob(); } } }
Du kan använda showPrintDialog(Window owner)
metod för att visa en utskriftsdialogruta där användaren kan ändra skrivaren och inställningarna för PrinterJob
. Returvärdet och parametern för denna metod har liknande betydelser som showPageSetupDialog()
metod.
Följande kodavsnitt visar hur man skapar en utskriftsdialog:
// Create the PrinterJob PrinterJob job = PrinterJob.createPrinterJob(); if (job == null) { return; } // Show the print setup dialog boolean proceed = job.showPrintDialog(owner); if (proceed) { print(job, node); }
5.2 GUI
Följande bild visar ett exempel på dialogrutan Print Setup:
Definition av utskriftsinställningen med JavaFX Print API
Efter att ha tryckt på Print Setup och Print Button
, kommer följande dialogruta att visas:
Definition av utskriftsinställningen med JavaFX Print API
Nu kan du definiera skrivaren, sidorna och andra attribut.
6. Anpassa inställningar för skrivarjobb
6.1 Koden
FxPrintExample6.java
import java.util.Set; import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.print.Collation; import javafx.print.JobSettings; import javafx.print.PageOrientation; import javafx.print.PrintSides; import javafx.print.Printer; import javafx.print.PrinterAttributes; import javafx.print.PrinterJob; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.TextArea; import javafx.scene.layout.VBox; import javafx.stage.Stage; public class FxPrintExample6 extends Application { // Create the TextArea final TextArea textArea = new TextArea(); public static void main(String[] args) { Application.launch(args); } @Override public void start(Stage stage) { // Create the Button Button button = new Button("Get all Printer Attributes"); // Create the Event-Handlers for the Buttons button.setOnAction(new EventHandler <ActionEvent>() { public void handle(ActionEvent event) { printAttributes(); } }); // Create the VBox with a 10px spacing VBox root = new VBox(10); // Add the Children to the VBox root.getChildren().addAll(button, textArea); // Set the Size of the VBox root.setPrefSize(400, 250); // Set the Style-properties of the VBox root.setStyle("-fx-padding: 10;" + "-fx-border-style: solid inside;" + "-fx-border-width: 2;" + "-fx-border-insets: 5;" + "-fx-border-radius: 5;" + "-fx-border-color: blue;"); // Create the Scene Scene scene = new Scene(root); // Add the scene to the Stage stage.setScene(scene); // Set the title of the Stage stage.setTitle("Showing all Printer Attributes"); // Display the Stage stage.show(); } private void printAttributes() { // Get the Default Printer Printer printer = Printer.getDefaultPrinter(); // Get the Printer Attributes PrinterAttributes attribs = printer.getPrinterAttributes(); // Read some printer attributes int maxCopies = attribs.getMaxCopies(); PrintSides printSides = attribs.getDefaultPrintSides(); Set<PageOrientation> orientations = attribs.getSupportedPageOrientations(); Set<Collation> collations = attribs.getSupportedCollations(); // Print the printer attributes textArea.appendText("Max. Copies: " + maxCopies + "\n"); textArea.appendText("Print Sides: " + printSides + "\n"); textArea.appendText("Supported Orientation: " + orientations + "\n"); textArea.appendText("Supported Collations: " + collations + "\n"); // Create a printer job for the default printer PrinterJob job = PrinterJob.createPrinterJob(); // Get the JobSettings for the print job JobSettings jobSettings = job.getJobSettings(); // Print the printer attributes textArea.appendText("Print Sides: " + jobSettings.getPrintSides() + "\n"); // Set the printSides to DUPLEX jobSettings.setPrintSides(PrintSides.DUPLEX); // Print the printer attributes textArea.appendText("Print Sides: " + jobSettings.getPrintSides() + "\n"); } }
Print API innehåller två klasser som är relaterade till skrivar- och skrivarjobbinställningar:
- Skrivarattribut
- Jobbinställningar
En Printer
har attribut som indikerar skrivarens utskriftsmöjligheter. Exempel på skrivarattribut är standardpappersstorlek, pappersstorlekar som stöds, maximalt antal kopior och standardsortering.
Ett PrinterAttributes-objekt kapslar in attributen för en Printer
. Print API låter dig inte ändra skrivarens attribut eftersom du inte kan ändra funktionerna hos en skrivare. Du kan bara använda dess kapacitet.
Du kan inte skapa en PrinterAttributes
objekt direkt. Du måste hämta den från en Printer
objekt med getPrinterAttributes()
metod.
Följande kodavsnitt skriver ut några attribut för standardskrivaren i maskinen:Du kan få en annan utdata.
// Get the Default Printer Printer printer = Printer.getDefaultPrinter(); // Get the Printer Attributes PrinterAttributes attribs = printer.getPrinterAttributes(); // Read some printer attributes int maxCopies = attribs.getMaxCopies(); PrintSides printSides = attribs.getDefaultPrintSides(); Set<PageOrientation> orientations = attribs.getSupportedPageOrientations(); Set<Collation> collations = attribs.getSupportedCollations(); // Print the printer attributes textArea.appendText("Max. Copies: " + maxCopies + "\n"); textArea.appendText("Print Sides: " + printSides + "\n"); textArea.appendText("Supported Orientation: " + orientations + "\n"); textArea.appendText("Supported Collations: " + collations + "\n");
En JobSettings innehåller de skrivarattribut som ska användas för ett utskriftsjobb för en specifik skrivare. Du kan få JobSettings
av ett utskriftsjobb med getJobSettings()
metod för PrinterJob
objekt. En JobSettings
är ett föränderligt objekt. Den innehåller en egenskap för varje skrivarattribut som kan ställas in för ett utskriftsjobb. Som standard initieras dess egenskaper till skrivarens standardegenskaper. Du kan ändra egenskapen som ska användas för det aktuella utskriftsjobbet. Om du ändrar egenskapen för en JobSettings
som inte stöds av skrivaren, återgår egenskapen till standardvärdet för skrivaren.
Följande kodavsnitt ställer in printSides
egenskap till DUPLEX
. I det här fallet stöder skrivaren endast ONE_SIDED
utskrift.
Därför printSides
egenskapen är inställd på ONE_SIDED
, som är standard och endast stöds printSides
värde av skrivaren. Du kan få en annan utdata.
// Create a printer job for the default printer PrinterJob job = PrinterJob.createPrinterJob(); // Get the JobSettings for the print job JobSettings jobSettings = job.getJobSettings(); // Print the printer attributes textArea.appendText("Print Sides: " + jobSettings.getPrintSides() + "\n"); // Set the printSides to DUPLEX jobSettings.setPrintSides(PrintSides.DUPLEX); // Print the printer attributes textArea.appendText("Print Sides: " + jobSettings.getPrintSides() + "\n");
För ett utskriftsjobb kan du ange sidintervallen med pageRanges
egenskapen för JobSettings
.
Egenskapen pageRanges är en array av PageRange. En PageRange
har startPage
och endPage
egenskaper som definierar intervallet.
6.2 GUI
Följande bild visar ett exempel på hur man skaffar Printer
attribut:
Visar alla skrivarattribut med JavaFX Print API
7. Ställa in sidlayout
7.1 Koden
FxPrintExample7.java
import javafx.print.JobSettings; import javafx.print.PageLayout; import javafx.print.PageOrientation; import javafx.print.Paper; import javafx.print.Printer; import javafx.print.PrinterJob; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.TextArea; import javafx.scene.layout.VBox; import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.stage.Stage; public class FxPrintExample7 extends Application { // Create the TextArea final TextArea textArea = new TextArea(); public static void main(String[] args) { Application.launch(args); } @Override public void start(Stage stage) { // Create the Button Button button = new Button("Get all Page Attributes"); // Create the Event-Handlers for the Buttons button.setOnAction(new EventHandler () { public void handle(ActionEvent event) { printAttributes(); } }); // Create the VBox with a 10px spacing VBox root = new VBox(10); // Add the Children to the VBox root.getChildren().addAll(button, textArea); // Set the Size of the VBox root.setPrefSize(400, 250); // Set the Style-properties of the VBox root.setStyle("-fx-padding: 10;" + "-fx-border-style: solid inside;" + "-fx-border-width: 2;" + "-fx-border-insets: 5;" + "-fx-border-radius: 5;" + "-fx-border-color: blue;"); // Create the Scene Scene scene = new Scene(root); // Add the scene to the Stage stage.setScene(scene); // Set the title of the Stage stage.setTitle("Showing all Page Layout Attributes"); // Display the Stage stage.show(); } private void printAttributes() { // Create the Printer Job PrinterJob printerJob = PrinterJob.createPrinterJob(); // Get The Printer Job Settings JobSettings jobSettings = printerJob.getJobSettings(); // Get the Page Layout PageLayout pageLayout = jobSettings.getPageLayout(); // Get the Page Attributes double pgW = pageLayout.getPrintableWidth(); double pgH = pageLayout.getPrintableHeight(); double pgLM = pageLayout.getLeftMargin(); double pgRM = pageLayout.getRightMargin(); double pgTM = pageLayout.getTopMargin(); double pgBM = pageLayout.getBottomMargin(); // Show the Page Attributes textArea.appendText("Printable Width: " + pgW + "\n"); textArea.appendText("Printable Height: " + pgH + "\n"); textArea.appendText("Page Left Margin: " + pgLM + "\n"); textArea.appendText("Page Right Margin: " + pgRM + "\n"); textArea.appendText("Page Top Margin: " + pgTM + "\n"); textArea.appendText("Page Bottom Margin: " + pgBM + "\n"); // Get The Printer Printer printer = printerJob.getPrinter(); // Create the Page Layout of the Printer pageLayout = printer.createPageLayout(Paper.A4, PageOrientation.LANDSCAPE,Printer.MarginType.EQUAL); jobSettings.setPageLayout(pageLayout); // Get the Page Attributes pgW = pageLayout.getPrintableWidth(); pgH = pageLayout.getPrintableHeight(); pgLM = pageLayout.getLeftMargin(); pgRM = pageLayout.getRightMargin(); pgTM = pageLayout.getTopMargin(); pgBM = pageLayout.getBottomMargin(); // Show the Page Attributes textArea.appendText("Printable Width: " + pgW + "\n"); textArea.appendText("Printable Height: " + pgH + "\n"); textArea.appendText("Page Left Margin: " + pgLM + "\n"); textArea.appendText("Page Right Margin: " + pgRM + "\n"); textArea.appendText("Page Top Margin: " + pgTM + "\n"); textArea.appendText("Page Bottom Margin: " + pgBM + "\n"); } }
En instans av PageLayout
klass representerar sidinställningarna för ett utskriftsjobb. Som standard är det inställt på skrivarens standardvärde. Du har redan sett hur du ställer in sidlayouten med hjälp av dialogrutan Utskriftsformat. En PageLayout
kapslar in tre saker:
- Pappersstorleken
- Sidorienteringen
- Sidmarginalerna
En PageLayout
används för att konfigurera sidans utskrivbara område, som måste ligga inom hårdvarans utskrivbara område. Om en sida renderas utanför det utskrivbara området för hårdvaran klipps innehållet. Du kan inte skapa en PageLayout
objekt direkt. Du måste använda en av createPageLayout()
metoder för Printer
för att få en PageLayout
.
- Sidlayout skapa Sidlayout(Papperspapper, Sidorientering, dubbel lMargin, dubbel rMargin, dubbel tMargin, dubbel bMargin)
- Sidlayout skapa Sidlayout(papperspapper, sidorientering, Printer.MarginType mType)
Marginalerna kan anges som siffror eller som en av följande konstanter för Printer.MarginType
enum.
- STANDARD
- LIKA
- EQUAL_OPPOSITES
- HARDWARE_MINIMUM
DEFAULT
marginaltyp begär standard 0,75 tum på alla sidor.
EQUAL
marginaltypen använder den största av de fyra hårdvarumarginalerna på alla fyra sidorna, så marginalerna är lika på alla fyra sidorna.
EQUAL_OPPOSITES
marginaltyp använder den största av vänster och höger hårdvarumarginaler för vänster och höger sida, och den större av de övre och nedre hårdvarumarginalerna för de övre och nedre sidorna.
HARDWARE_MINIMUM
begär att de minsta tillåtna hårdvarumarginalerna ska ställas in på alla sidor.
Följande kodavsnitt skapar en PageLayout
för papper i A4-storlek, LANDSCAPE
sidorientering och lika marginaler på alla sidor. PageLayout
är inställd på ett utskriftsjobb.
// Get The Printer Printer printer = printerJob.getPrinter(); // Create the Page Layout of the Printer pageLayout = printer.createPageLayout(Paper.A4, PageOrientation.LANDSCAPE,Printer.MarginType.EQUAL); jobSettings.setPageLayout(pageLayout); // Get the Page Attributes pgW = pageLayout.getPrintableWidth(); pgH = pageLayout.getPrintableHeight(); pgLM = pageLayout.getLeftMargin(); pgRM = pageLayout.getRightMargin(); pgTM = pageLayout.getTopMargin(); pgBM = pageLayout.getBottomMargin();
Ibland vill du veta storleken på det utskrivbara området på sidan. Du kan få det med getPrintableWidth()
och getPrintableHeight()
metoder för PageLayout
. Detta är användbart om du vill ändra storlek på en nod före utskrift, så att den passar det utskrivbara området.
// Create the Printer Job PrinterJob printerJob = PrinterJob.createPrinterJob(); // Get The Printer Job Settings JobSettings jobSettings = printerJob.getJobSettings(); // Get the Page Layout PageLayout pageLayout = jobSettings.getPageLayout(); // Get the Page Attributes double pgW = pageLayout.getPrintableWidth(); double pgH = pageLayout.getPrintableHeight(); double pgLM = pageLayout.getLeftMargin(); double pgRM = pageLayout.getRightMargin(); double pgTM = pageLayout.getTopMargin(); double pgBM = pageLayout.getBottomMargin(); // Show the Page Attributes textArea.appendText("Printable Width: " + pgW + "\n"); textArea.appendText("Printable Height: " + pgH + "\n"); textArea.appendText("Page Left Margin: " + pgLM + "\n"); textArea.appendText("Page Right Margin: " + pgRM + "\n"); textArea.appendText("Page Top Margin: " + pgTM + "\n"); textArea.appendText("Page Bottom Margin: " + pgBM + "\n");
7.2 GUI
Följande bild visar ett exempel på hur man får sidattributen:
Visar alla sidlayoutattribut med JavaFX Print API
8. Ladda ner Java-källkod
Detta var ett exempel på javafx.print
JavaFX utskrift