/*
 * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

package javafx.print;

import java.util.Set;

import javafx.beans.property.BooleanProperty;
import javafx.beans.property.BooleanPropertyBase;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.Property;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.beans.value.ObservableValue;

The JobSettings class encapsulates most of the configuration of a print job. Applications do not - and cannot - directly create or set a JobSettings instance. One is already installed on the print job when it is created.

As documented on PrinterJob, the JobSettings installed on that job will initially reflect the current default settings for the initially associated printer for that job.

The JobSettings delegate then remains the same for the life of the job, and will have it's member properties updated to be compatible with a change in Printer on the job. For example as a result of a user interaction via a platform's dialog. An incompatible setting will usually cause the setting to revert to the default for the new printer.

Any implicit or explicit updates to settings resulting from the user interaction with dialog will be propagated and visible to the application once the user approves the settings by dismissing the dialog using its "accept" option.

For most printing applications it is likely sufficient to let the user set the desired options and have these propagated to the job. For applications which need them, there are setter and getter methods for the individual options, which are also available as properties, and change in values of settings may be monitored and updated via these properties.

Not all values of settings are available on all printers. For example a printer may not support two-sided printing. See the Printer class for how to to determine supported settings.

Since:JavaFX 8.0
/** * The JobSettings class encapsulates most of the configuration of a * print job. Applications do not - and cannot - directly create or * set a JobSettings instance. One is already installed on the print job * when it is created. * <p> * As documented on PrinterJob, the JobSettings installed on that job will * initially reflect the current default settings for the initially * associated printer for that job. * <p> * The JobSettings delegate then remains the same for the life of the job, * and will have it's member properties updated to be compatible with * a change in Printer on the job. For example as a * result of a user interaction via a platform's dialog. * An incompatible setting will usually cause the setting to revert to * the default for the new printer. * <p> * Any implicit or explicit updates to settings resulting from * the user interaction with dialog will be propagated and visible to * the application once the user approves the settings by * dismissing the dialog using its "accept" option. * <p> * For most printing applications it is likely sufficient to let the user * set the desired options and have these propagated to the job. * For applications which need them, * there are setter and getter methods for the individual options, * which are also available as properties, and change in values of * settings may be monitored and updated via these properties. * <p> * Not all values of settings are available on all printers. For example * a printer may not support two-sided printing. * See the {@link javafx.print.Printer Printer} class for how to * to determine supported settings. * * @since JavaFX 8.0 */
public final class JobSettings { private PrinterJob job; private Printer printer; private PrinterAttributes printerCaps; /* * There's no need for client code to create a JobSettings * as there is already one set on a PrinterJob and it must * be updated, not replaced. So we do not expose the constructor. * */ JobSettings(Printer printer) { this.printer = printer; printerCaps = printer.getPrinterAttributes(); } void setPrinterJob(PrinterJob job) { this.job = job; } private boolean isJobNew() { // If we haven't yet set the job its equivalent to a new job. return job == null || job.isJobNew(); } /* * We need to be able to distinguish settings which are * the printer defaults, versus explicitly set ones. so * the settings object remembers for each setting if it * was an explicit setting or a default. * Settings such as JobName which are supportable across printers * don't need this treatment. */ private boolean defaultCopies = true; private boolean hasOldCopies = false; private int oldCopies; private boolean defaultSides = true; private boolean hasOldSides = false; private PrintSides oldSides; private boolean defaultCollation = true; private boolean hasOldCollation = false; private Collation oldCollation; private boolean defaultPrintColor = true; private boolean hasOldPrintColor = false; private PrintColor oldPrintColor; private boolean defaultPrintQuality = true; private boolean hasOldPrintQuality = false; private PrintQuality oldPrintQuality; private boolean defaultPrintResolution = true; private boolean hasOldPrintResolution = false; private PrintResolution oldPrintResolution; private boolean defaultPaperSource = true; private boolean hasOldPaperSource = false; private PaperSource oldPaperSource; private boolean defaultPageLayout = true; private boolean hasOldPageLayout = false; private PageLayout oldPageLayout;
If any settings are incompatible with the specified printer, they are updated to be compatible. This method could be useful as a public one.
/** * If any settings are incompatible with the specified printer, * they are updated to be compatible. * This method could be useful as a public one. */
void updateForPrinter(Printer printer) { this.printer = printer; this.printerCaps = printer.getPrinterAttributes(); //////////////////////////////////////////////// /* * The algorithm for how we update is tricky in order to get * the desired behaviour, which needs to be explained first. * - If neither user nor code ever set a value for a property, * we always update to the default for the new printer. * - If user or code has ever explicitly set a value for a * property then when we navigate to a different printer we * remember that last set value. * - If the new printer can support that value, it is used * - If it can't, then we use the default value for that printer, * or in a few cases some 'close' value. Such as substituting * LANDSCAPE for REVERSE_LANDSCAPE. * - We still remember the value and if we move to another printer * that supports it, it gets resurrected. */ //////////// COPIES //////////// if (defaultCopies) { if (getCopies() != printerCaps.getDefaultCopies()) { setCopies(printerCaps.getDefaultCopies()); defaultCopies = true; // restore that this is default. } } else { int copies = getCopies(); if (hasOldCopies && oldCopies > copies) { copies = oldCopies; } int maxCopies = printerCaps.getMaxCopies(); if (!hasOldCopies && getCopies() > maxCopies) { hasOldCopies = true; oldCopies = getCopies(); } if (copies > maxCopies) copies = maxCopies; setCopies(copies); } //////////////////////////////////////////////// PrintSides currSides = getPrintSides(); PrintSides defSides = printerCaps.getDefaultPrintSides(); Set<PrintSides> suppSides = printerCaps.getSupportedPrintSides(); if (defaultSides) { if (currSides != defSides) { setPrintSides(defSides); defaultSides = true; // restore that this is default. } } else { // The "current" sides may not be the one we really wanted, // but one that was forced by virtue of the current printer not // supporting the one specified for a previous printer. // Check to see if the old supported value can now // be restored on this new printer. if (hasOldSides) { if (suppSides.contains(oldSides)) { setPrintSides(oldSides); hasOldSides = false; // is current again. } else { setPrintSides(defSides); } } else if (!suppSides.contains(currSides)) { hasOldSides = true; oldSides = currSides; setPrintSides(defSides); } } //////////////////////////////////////////////// Collation currColl = getCollation(); Collation defColl = printerCaps.getDefaultCollation(); Set<Collation> suppColl = printerCaps.getSupportedCollations(); if (defaultCollation) { if (currColl != defColl) { setCollation(defColl); defaultCollation = true; // restore that this is default. } } else { if (hasOldCollation) { if (suppColl.contains(oldCollation)) { setCollation(oldCollation); hasOldCollation = false; // is current again. } else { setCollation(defColl); } } else if (!suppColl.contains(currColl)) { hasOldCollation = true; oldCollation = currColl; setCollation(defColl); } } //////////////////////////////////////////////// PrintColor currColor = getPrintColor(); PrintColor defColor = printerCaps.getDefaultPrintColor(); Set<PrintColor> suppColors = printerCaps.getSupportedPrintColors(); if (defaultPrintColor) { if (currColor != defColor) { setPrintColor(defColor); defaultPrintColor = true; // restore that this is default. } } else { if (hasOldPrintColor) { if (suppColors.contains(oldPrintColor)) { setPrintColor(oldPrintColor); hasOldPrintColor = false; // is current again. } else { setPrintColor(defColor); } } else if (!suppColors.contains(currColor)) { hasOldPrintColor = true; oldPrintColor = currColor; setPrintColor(defColor); } } //////////////////////////////////////////////// PrintQuality currQuality = getPrintQuality(); PrintQuality defQuality = printerCaps.getDefaultPrintQuality(); Set<PrintQuality> suppQuality = printerCaps.getSupportedPrintQuality(); if (defaultPrintQuality) { if (currQuality != defQuality) { setPrintQuality(defQuality); defaultPrintQuality = true; // restore that this is default. } } else { if (hasOldPrintQuality) { if (suppQuality.contains(oldPrintQuality)) { setPrintQuality(oldPrintQuality); hasOldPrintQuality = false; // is current again. } else { setPrintQuality(defQuality); } } else if (!suppQuality.contains(currQuality)) { hasOldPrintQuality = true; oldPrintQuality = currQuality; setPrintQuality(defQuality); } } //////////////////////////////////////////////// PrintResolution currRes = getPrintResolution(); PrintResolution defResolution = printerCaps.getDefaultPrintResolution(); Set<PrintResolution> suppRes = printerCaps.getSupportedPrintResolutions(); if (defaultPrintResolution) { if (currRes != defResolution) { setPrintResolution(defResolution); defaultPrintResolution = true; // restore that this is default. } } else { if (hasOldPrintResolution) { if (suppRes.contains(oldPrintResolution)) { setPrintResolution(oldPrintResolution); hasOldPrintResolution = false; // is current again. } else { setPrintResolution(defResolution); } } else if (!suppRes.contains(currRes)) { hasOldPrintResolution = true; oldPrintResolution = currRes; setPrintResolution(defResolution); } } //////////////////////////////////////////////// PaperSource currSource = getPaperSource(); PaperSource defSource = printerCaps.getDefaultPaperSource(); Set<PaperSource> suppSources = printerCaps.getSupportedPaperSources(); if (defaultPaperSource) { if (currSource != defSource) { setPaperSource(defSource); defaultPaperSource = true; // restore that this is default. } } else { if (hasOldPaperSource) { if (suppSources.contains(oldPaperSource)) { setPaperSource(oldPaperSource); hasOldPaperSource = false; // is current again. } else { setPaperSource(defSource); } } else if (!suppSources.contains(currSource)) { hasOldPaperSource = true; oldPaperSource = currSource; setPaperSource(defSource); } } /////////////////////////////////////////////////// // Paper size is an important component of PageLayout // and the selected paper input tray may affect the paper sizes // that are supported. For example non-standard sizes may // require a manual or secondary input tray to be used. // The implementation below is not accounting for that and // it likely should, which means that when updating to a new // printer we need to consider tray and layout together, not // consecutively. PageLayout currPageLayout = getPageLayout(); PageLayout defPageLayout = printer.getDefaultPageLayout(); if (defaultPageLayout) { // It might appear cleaner to always set the default page layout // instance for this printer, but it if they are equal, then // either set(..) will skip it anyway, or it won't and a // listener will see a somewhat spurious change in the property. if (!currPageLayout.equals(defPageLayout)) { setPageLayout(defPageLayout); defaultPageLayout = true; // restore that this is default. } } else { if (hasOldPageLayout) { PageLayout valPageLayout = job.validatePageLayout(oldPageLayout); if (valPageLayout.equals(oldPageLayout)) { setPageLayout(oldPageLayout); hasOldPageLayout = false; // is current again. } else { setPageLayout(defPageLayout); } } else { PageLayout valPageLayout = job.validatePageLayout(currPageLayout); if (!valPageLayout.equals(currPageLayout)) { hasOldPageLayout = true; oldPageLayout = currPageLayout; // Should I use the validated layout instead ? setPageLayout(defPageLayout); } } } } /////////////////////// START JOBNAME ///////////////////// private static final String DEFAULT_JOBNAME = "JavaFX Print Job"; private SimpleStringProperty jobName;
StringProperty representing the name of a job.
Returns:the name of a job
/** * <code>StringProperty</code> representing the name of a job. * @return the name of a job */
public final StringProperty jobNameProperty() { if (jobName == null) { jobName = new SimpleStringProperty(JobSettings.this, "jobName", DEFAULT_JOBNAME) { @Override public void set(String value) { if (!isJobNew()) { return; } if (value == null) { value = DEFAULT_JOBNAME; } super.set(value); } @Override public void bind(ObservableValue<? extends String> rawObservable) { throw new RuntimeException("Jobname property cannot be bound"); } @Override public void bindBidirectional(Property<String> other) { throw new RuntimeException("Jobname property cannot be bound"); } }; } return jobName; }
Get the name of a job.
Returns:a string representing the name of a job
/** * Get the name of a job. * @return a string representing the name of a job */
public String getJobName() { return jobNameProperty().get(); }
Set the name of a job.
Params:
  • name – string representing the name of a job
/** * Set the name of a job. * @param name string representing the name of a job */
public void setJobName(String name) { jobNameProperty().set(name); } /////////////////////// END JOBNAME ///////////////////// //////////////////////// START COPIES //////////////////////// private IntegerProperty copies;
IntegerProperty representing the number of copies of the job to print.
Returns:the number of copies of the job to print
/** * <code>IntegerProperty</code> representing the number of * copies of the job to print. * @return the number of copies of the job to print */
public final IntegerProperty copiesProperty() { if (copies == null) { copies = new SimpleIntegerProperty(JobSettings.this, "copies", printerCaps.getDefaultCopies()) { @Override public void set(int value) { if (!isJobNew()) { return; } if (value <= 0) { if (defaultCopies) { return; } else { super.set(printerCaps.getDefaultCopies()); defaultCopies = true; return; } } super.set(value); defaultCopies = false; } @Override public void bind(ObservableValue<? extends Number> rawObservable) { throw new RuntimeException("Copies property cannot be bound"); } @Override public void bindBidirectional(Property<Number> other) { throw new RuntimeException("Copies property cannot be bound"); } }; } return copies; }
Get the number of copies to print.
Returns:number of copies to print
/** * Get the number of copies to print. * @return number of copies to print */
public int getCopies() { return copiesProperty().get(); }
Set the number of copies to print.
Params:
  • nCopies – number of copies to print
/** * Set the number of copies to print. * @param nCopies number of copies to print */
public final void setCopies(int nCopies) { copiesProperty().set(nCopies); } //////////////////////// END COPIES //////////////////////// /////////////////////// START PAGE RANGES ///////////////////// private ObjectProperty<PageRange[]> pageRanges = null;
An ObjectProperty whose value represents the job pages to print as an array of PageRange. A null values mean print all pages. Otherwise it must be a non-overlapping array of PageRange instances ordered in increasing page number. Page numbers start from 1 (one). An empty array is considered equivalent to a null array.

An illegal or unsupported (by the printer) set of page ranges will be ignored.

Ranges which exceed beyond the number of pages imaged by the job during printing do not cause any error.

Returns:the value presents the job pages to print as an array of PageRange
/** * An <code>ObjectProperty</code> whose value represents the job pages * to print as an array of PageRange. * A null values mean print all pages. * Otherwise it must be a non-overlapping array of PageRange * instances ordered in increasing page number. * Page numbers start from 1 (one). * An empty array is considered equivalent to a null array. * <p> * An illegal or unsupported (by the printer) set of page ranges * will be ignored. * <p> * Ranges which exceed beyond the number of pages imaged by the job * during printing do not cause any error. * * @return the value presents the job pages to print as an array of PageRange */
public final ObjectProperty pageRangesProperty() { if (pageRanges == null) { pageRanges = new SimpleObjectProperty(JobSettings.this, "pageRanges", null) { @Override public void set(Object o) { try { set((PageRange[])o); } catch (ClassCastException e) { return; } } public void set(PageRange[] value) { if (!isJobNew()) { return; } if (value == null || value.length == 0 || value[0] == null) { value = null; } else { // validate int len = value.length; PageRange[] arr = new PageRange[len]; int curr = 0; for (int i=0; i<len; i++) { PageRange r = value[i]; if (r == null || curr >= r.getStartPage()) { return; // bad range } curr = r.getEndPage(); arr[i] = r; } value = arr; } // passed validation so its either null, // or an array of ranges in increasing order. super.set(value); } @Override public void bind(ObservableValue rawObservable) { throw new RuntimeException ("PageRanges property cannot be bound"); } @Override public void bindBidirectional(Property other) { throw new RuntimeException ("PageRanges property cannot be bound"); } }; } return pageRanges; }
The range of pages to print. null always means all pages. See pageRangesProperty for more details.
Returns:null or an array as specified above
/** * The range of pages to print. null always means all pages. * See {@link pageRangesProperty} for more details. * @return null or an array as specified above */
public PageRange[] getPageRanges() { return (PageRange[])(pageRangesProperty().get()); }
The range of pages to print as an array of PageRange. The use of varargs means the common case of a single range can be auto-boxed. ((PageRange[])null) always means all pages however since this is the default it is less likely to be used. See pageRangesProperty for more details.
Params:
  • pages – null or a varargs array as specified above
/** * The range of pages to print as an array of PageRange. * The use of varargs means the common case of a single range * can be auto-boxed. * <code>((PageRange[])null)</code> always means all pages however * since this is the default it is less likely to be used. * See {@link pageRangesProperty} for more details. * @param pages null or a varargs array as specified above */
public void setPageRanges(PageRange... pages) { pageRangesProperty().set((PageRange[])pages); } /////////////////////// END PAGE RANGES ///////////////////// /////////////////////// START SIDES ///////////////////// private ObjectProperty<PrintSides> sides = null;
Property representing an instance of PrintSides.
Returns:an instance of PrintSides
/** * Property representing an instance of <code>PrintSides</code>. * @return an instance of <code>PrintSides</code> */
public final ObjectProperty<PrintSides> printSidesProperty() { if (sides == null) { sides = new SimpleObjectProperty<PrintSides> (JobSettings.this, "printSides", printerCaps.getDefaultPrintSides()) { @Override public void set(PrintSides value) { if (!isJobNew()) { return; } if (value == null) { if (defaultSides) { return; } else { super.set(printerCaps.getDefaultPrintSides()); defaultSides = true; } } if (printerCaps.getSupportedPrintSides().contains(value)) { super.set(value); defaultSides = false; } } @Override public void bind(ObservableValue<? extends PrintSides> rawObservable) { throw new RuntimeException ("PrintSides property cannot be bound"); } @Override public void bindBidirectional(Property<PrintSides> other) { throw new RuntimeException ("PrintSides property cannot be bound"); } }; } return sides; }
If a printer supports it, then a job may be printed on both sides of the media (paper), ie duplex printing. This method returns the selected setting.
Returns:the duplex (side) setting.
/** * If a printer supports it, then a job may be printed on * both sides of the media (paper), ie duplex printing. * This method returns the selected setting. * @return the duplex (side) setting. */
public PrintSides getPrintSides() { return printSidesProperty().get(); }
Set the PrintSides property which controls duplex printing. A null value is ignored.
Params:
  • sides – new setting for number of sides.
/** * Set the <code>PrintSides</code> property which controls * duplex printing. * A null value is ignored. * @param sides new setting for number of sides. */
public void setPrintSides(PrintSides sides) { if (sides == getPrintSides()) { return; } printSidesProperty().set(sides); } /////////////////////// END SIDES ///////////////////// /////////////////////// START COLLATION ///////////////////// private ObjectProperty<Collation> collation = null;
Property representing an instance of Collation.
Returns:an instance of Collation
/** * Property representing an instance of <code>Collation</code>. * @return an instance of <code>Collation</code> */
public final ObjectProperty<Collation> collationProperty() { if (collation == null) { Collation coll = printerCaps.getDefaultCollation(); collation = new SimpleObjectProperty<Collation> (JobSettings.this, "collation", coll) { @Override public void set(Collation value) { if (!isJobNew()) { return; } if (value == null) { if (defaultCollation) { return; } else { super.set(printerCaps.getDefaultCollation()); defaultCollation = true; return; } } if (printerCaps.getSupportedCollations().contains(value)) { super.set(value); defaultCollation = false; } } @Override public void bind(ObservableValue<? extends Collation> rawObservable) { throw new RuntimeException ("Collation property cannot be bound"); } @Override public void bindBidirectional(Property<Collation> other) { throw new RuntimeException ("Collation property cannot be bound"); } }; } return collation; }
Collation determines how sheets are sorted when multiple copies of a document are printed. As such it is only relevant if 2 or more copies of a document with 2 more sheets are printed. A sheet is the physical media, so documents with 2 pages that are printed N-up, or double-sided may still have only one sheet. A collated print job produces documents with sheets of a document sorted in sequence. An uncollated job collects together the multiple copies of the same sheet. Uncollated (false) is the typical default value.
Returns:the collation
/** * Collation determines how sheets are sorted when * multiple copies of a document are printed. * As such it is only relevant if 2 or more copies of * a document with 2 more sheets are printed. * A sheet is the physical media, so documents with 2 pages * that are printed N-up, or double-sided may still have only * one sheet. * A collated print job produces documents with sheets * of a document sorted in sequence. * An uncollated job collects together the multiple copies * of the same sheet. * Uncollated (<code>false</code>) is the typical default value. * * @return the collation */
public Collation getCollation() { return collationProperty().get(); }
Set the Collation property. A null value is ignored.
Params:
  • collation – new setting for collation
/** * Set the <code>Collation</code> property. * A null value is ignored. * @param collation new setting for collation */
public void setCollation(Collation collation) { if (collation == getCollation()) { return; } collationProperty().set(collation); } /////////////////////// END COLLATION ///////////////////// /////////////////////// START COLOUR ///////////////////// private ObjectProperty<PrintColor> color = null;
Property representing an instance of PrintColor.
Returns:an instance of PrintColor
/** * Property representing an instance of <code>PrintColor</code>. * @return an instance of <code>PrintColor</code> */
public final ObjectProperty<PrintColor> printColorProperty() { if (color == null) { color = new SimpleObjectProperty<PrintColor> (JobSettings.this, "printColor", printerCaps.getDefaultPrintColor()) { @Override public void set(PrintColor value) { if (!isJobNew()) { return; } if (value == null) { if (defaultPrintColor) { return; } else { super.set(printerCaps.getDefaultPrintColor()); defaultPrintColor = true; } } if (printerCaps. getSupportedPrintColors().contains(value)) { super.set(value); defaultPrintColor = false; } } @Override public void bind(ObservableValue<? extends PrintColor> rawObservable) { throw new RuntimeException ("PrintColor property cannot be bound"); } @Override public void bindBidirectional(Property<PrintColor> other) { throw new RuntimeException ("PrintColor property cannot be bound"); } }; } return color; } public PrintColor getPrintColor() { return printColorProperty().get(); }
Set the PrintColor property. A null value is ignored.
Params:
  • color – new setting for print color.
/** * Set the <code>PrintColor</code> property. * A null value is ignored. * * @param color new setting for print color. */
public void setPrintColor(PrintColor color) { if (color == getPrintColor()) { return; } printColorProperty().set(color); } /////////////////////// END COLOUR ///////////////////// /////////////////////// START QUALITY ///////////////////// private ObjectProperty<PrintQuality> quality = null;
Property representing an instance of PrintQuality.
Returns:an instance of PrintQuality
/** * Property representing an instance of <code>PrintQuality</code>. * @return an instance of <code>PrintQuality</code> */
public final ObjectProperty<PrintQuality> printQualityProperty() { if (quality == null) { quality = new SimpleObjectProperty<PrintQuality> (JobSettings.this, "printQuality", printerCaps.getDefaultPrintQuality()) { @Override public void set(PrintQuality value) { if (!isJobNew()) { return; } if (value == null) { if (defaultPrintQuality) { return; } else { super.set(printerCaps.getDefaultPrintQuality()); defaultPrintQuality = true; } } if (printerCaps. getSupportedPrintQuality().contains(value)) { super.set(value); defaultPrintQuality = false; } } @Override public void bind(ObservableValue<? extends PrintQuality> rawObservable) { throw new RuntimeException ("PrintQuality property cannot be bound"); } @Override public void bindBidirectional(Property<PrintQuality> other) { throw new RuntimeException ("PrintQuality property cannot be bound"); } }; } return quality; } public PrintQuality getPrintQuality() { return printQualityProperty().get(); }
Set the PrintQuality property. A null value is ignored.

Note that quality and resolution overlapping concepts. Therefore a printer may support setting one, or the other but not both. Applications setting these programmatically should query both properties and select appropriately from the supported values. If a printer supports non-standard values, code likely cannot distinguish the printer's interpretation of these values and is safest to stick to selecting from the standard value that matches the requirement.

Params:
  • quality – new setting for print quality.
/** * Set the <code>PrintQuality</code> property. * A null value is ignored. * <p> * Note that quality and resolution overlapping concepts. * Therefore a printer may support setting one, or the other but * not both. Applications setting these programmatically should * query both properties and select appropriately from the supported * values. If a printer supports non-standard values, code likely * cannot distinguish the printer's interpretation of these values * and is safest to stick to selecting from the standard value that * matches the requirement. * @param quality new setting for print quality. */
public void setPrintQuality(PrintQuality quality) { if (quality == getPrintQuality()) { return; } printQualityProperty().set(quality); } /////////////////////// END QUALITY ///////////////////// /////////////////////// START RESOLUTION ///////////////////// private ObjectProperty<PrintResolution> resolution = null;
Property representing an instance of PrintResolution.
Returns:an instance of PrintResolution
/** * Property representing an instance of <code>PrintResolution</code>. * @return an instance of <code>PrintResolution</code> */
public final ObjectProperty<PrintResolution> printResolutionProperty() { if (resolution == null) { resolution = new SimpleObjectProperty<PrintResolution> (JobSettings.this, "printResolution", printerCaps.getDefaultPrintResolution()) { @Override public void set(PrintResolution value) { if (!isJobNew()) { return; } if (value == null) { if (defaultPrintResolution) { return; } else { super.set(printerCaps.getDefaultPrintResolution()); defaultPrintResolution = true; } } if (printerCaps.getSupportedPrintResolutions(). contains(value)) { super.set(value); defaultPrintResolution = false; } } @Override public void bind(ObservableValue<? extends PrintResolution> rawObservable) { throw new RuntimeException ("PrintResolution property cannot be bound"); } @Override public void bindBidirectional(Property<PrintResolution> other) { throw new RuntimeException ("PrintResolution property cannot be bound"); } }; } return resolution; }
Returns:the print resolution
/** * * @return the print resolution */
public PrintResolution getPrintResolution() { return printResolutionProperty().get(); }
Set the PrintResolution property. A null value is ignored.

Note that quality and resolution overlapping concepts. Therefore a printer may support setting one, or the other but not both. Applications setting these programmatically should query both properties and select appropriately from the supported values. If a printer supports non-standard values, code likely cannot distinguish the printer's interpretation of these values and is safest to stick to selecting from the standard value that matches the requirement.

Params:
  • resolution – new setting for print resolution.
/** * Set the <code>PrintResolution</code> property. * A null value is ignored. * <p> * Note that quality and resolution overlapping concepts. * Therefore a printer may support setting one, or the other but * not both. Applications setting these programmatically should * query both properties and select appropriately from the supported * values. If a printer supports non-standard values, code likely * cannot distinguish the printer's interpretation of these values * and is safest to stick to selecting from the standard value that * matches the requirement. * @param resolution new setting for print resolution. */
public void setPrintResolution(PrintResolution resolution) { if (resolution == null || resolution == getPrintResolution()) { return; } printResolutionProperty().set(resolution); } /////////////////////// END RESOLUTION ///////////////////// //////////////// START PAPERSOURCE ///////////////// private ObjectProperty<PaperSource> paperSource = null;
Property representing an instance of PaperSource.
Returns:an instance of PaperSource
/** * Property representing an instance of <code>PaperSource</code>. * @return an instance of <code>PaperSource</code> */
public final ObjectProperty<PaperSource> paperSourceProperty() { if (paperSource == null) { paperSource = new SimpleObjectProperty<PaperSource> (JobSettings.this, "paperSource", printerCaps.getDefaultPaperSource()) { @Override public void set(PaperSource value) { if (!isJobNew()) { return; } if (value == null) { if (defaultPaperSource) { return; } else { super.set(printerCaps.getDefaultPaperSource()); defaultPaperSource = true; } } if (printerCaps. getSupportedPaperSources().contains(value)) { super.set(value); defaultPaperSource = false; } } @Override public void bind(ObservableValue<? extends PaperSource> rawObservable) { throw new RuntimeException ("PaperSource property cannot be bound"); } @Override public void bindBidirectional(Property<PaperSource> other) { throw new RuntimeException ("PaperSource property cannot be bound"); } }; } return paperSource; } public PaperSource getPaperSource() { return paperSourceProperty().get(); } public void setPaperSource(PaperSource value) { paperSourceProperty().set(value); } //////////////// END PAPERSOURCE ///////////////// //////////////// START PAGELAYOUT ///////////////// /* * Default page needs to originate from the printer, be the * default for the initial settings on the job. * having "page" be a property might make sense and perhaps * for the elts of a paper like orientation. * But what is the point in listening in on the paper of a Page * or orientation if a whole new Page is added instead .. */ private ObjectProperty<PageLayout> layout = null;
Property representing an instance of PageLayout.
Returns:an instance of PageLayout
/** * Property representing an instance of <code>PageLayout</code>. * @return an instance of <code>PageLayout</code> */
public final ObjectProperty<PageLayout> pageLayoutProperty() { if (layout == null) { layout = new SimpleObjectProperty<PageLayout> (JobSettings.this, "pageLayout", printer.getDefaultPageLayout()) { @Override public void set(PageLayout value) { if (!isJobNew()) { return; } if (value == null) { return; } defaultPageLayout = false; super.set(value); } @Override public void bind(ObservableValue<? extends PageLayout> rawObservable) { throw new RuntimeException ("PageLayout property cannot be bound"); } @Override public void bindBidirectional(Property<PageLayout> other) { throw new RuntimeException ("PageLayout property cannot be bound"); } }; } return layout; }
Get the current page layout for this job.
Returns:page layout to use for the job.
/** * Get the current page layout for this job. * @return page layout to use for the job. */
public PageLayout getPageLayout() { return pageLayoutProperty().get(); }
Set the PageLayout to use.
Params:
  • pageLayout – The page layout to use.
/** * Set the PageLayout to use. * @param pageLayout The page layout to use. */
public void setPageLayout(PageLayout pageLayout) { pageLayoutProperty().set(pageLayout); } //////////////// END PAGELAYOUT ///////////////// @Override public String toString() { String nl = System.lineSeparator(); return " Collation = " + getCollation() + nl + " Copies = " + getCopies() + nl + " Sides = " + getPrintSides() + nl + " JobName = " + getJobName() + nl + " Page ranges = " + getPageRanges() + nl + " Print color = " + getPrintColor() + nl + " Print quality = " + getPrintQuality() + nl + " Print resolution = " + getPrintResolution() + nl + " Paper source = " + getPaperSource() + nl + " Page layout = " + getPageLayout(); } }