| 13.3 Printing with the Java 1.4 APIExample 13-3 is a further subclass of our Julia set
component, which once again overrides the print( )
method and this time uses the Java 1.4 Printing API to produce the printed
output shown in Figure 13-3. In addition, it defines
a save( ) method that uses the Java 1.4 Printing
API to print the image of the Julia set directly to a PostScript
file. The actual printing of the image is done by the
PrintableComponent class inherited from the
previous example: what is different in this example is the way the
Printable object is sent to a printer.   The print( ) and save( )
methods start by obtaining an appropriate
PrintService object that represents a printer or
print engine that can print to a file. Both methods then call the
printToService(
) method, which uses the inherited
PrintableComponent class to print the Julia set to
the PrintService. One interesting feature of this
method is its use of a
PrintJobListener
to monitor the progress of the print job and display its current
status in a dialog box. Example 13-3. JuliaSet3.javapackage je3.print;
import javax.swing.*;
import java.awt.print.*;     // Java 1.4 can use the 1.2 Printable API
import javax.print.*;        // Java 1.4 API 
import javax.print.event.*;  
import javax.print.attribute.*;
import javax.print.attribute.standard.*;
import java.io.*;
/**
 * This class extends JuliaSet2, and its print( ) and save( ) methods demonstrate
 * the Java 1.4 printing API.
 **/
public class JuliaSet3 extends JuliaSet2 {
    public JuliaSet3( ) { super(-.7, -.25); }
    // This method overrides JuliaSet2.print( ) and demonstrates the javax.print
    // printing API.
    public void print( ) {
        // Get a list of all printers that can handle Printable objects.
        DocFlavor flavor = DocFlavor.SERVICE_FORMATTED.PRINTABLE;
        PrintService[  ] services =
            PrintServiceLookup.lookupPrintServices(flavor, null);
        // Set some printing attributes
        PrintRequestAttributeSet printAttributes =
            new HashPrintRequestAttributeSet( );
        printAttributes.add(OrientationRequested.LANDSCAPE); // landscape mode
        printAttributes.add(Chromaticity.MONOCHROME);        // print in mono
        // Display a dialog that allows the user to select one of the
        // available printers and to edit the default attributes
        PrintService service = ServiceUI.printDialog(null, 100, 100,
                                                     services, null, null,
                                                     printAttributes);
        // If the user canceled, don't do anything
        if (service == null) return;
        // Now call a method defined below to finish the printing
        printToService(service, printAttributes);
    }
    // This method is like print( ) above but prints to a PostScript file
    // instead of printing to a printer.
    public void save( ) throws IOException {
        // Find a factory object for printing Printable objects to PostScript.
        DocFlavor flavor = DocFlavor.SERVICE_FORMATTED.PRINTABLE;
        String format = "application/postscript";
        StreamPrintServiceFactory factory = StreamPrintServiceFactory.
            lookupStreamPrintServiceFactories(flavor, format)[0];
        // Ask the user to select a file and open the selected file
        JFileChooser chooser = new JFileChooser( );
        if (chooser.showSaveDialog(this)!=JFileChooser.APPROVE_OPTION) return;
        File f = chooser.getSelectedFile( );
        FileOutputStream out = new FileOutputStream(f);
        // Obtain a PrintService that prints to that file
        StreamPrintService service = factory.getPrintService(out);
        // Do the printing with the method below
        printToService(service, null);
        // And close the output file.
        out.close( );
    }
    // Print the Julia set to the sepecifed PrintService using the specified
    // attributes.
    public void printToService(PrintService service,
                               PrintRequestAttributeSet printAttributes)
    {
        // Wrap ourselves in the PrintableComponent class defined by JuliaSet2.
        String title = "Julia set for c={" + cx + "," + cy + "}";
        Printable printable = new PrintableComponent(this, title);
        // Now create a Doc that encapsulates the Printable object and its type
        DocFlavor flavor = DocFlavor.SERVICE_FORMATTED.PRINTABLE;
        Doc doc = new SimpleDoc(printable, flavor, null);
        // Java 1.1 uses PrintJob.
        // Java 1.2 uses PrinterJob.
        // Java 1.4 uses DocPrintJob. Create one from the service
        DocPrintJob job = service.createPrintJob( );
        // Set up a dialog box to  monitor printing status
        final JOptionPane pane = new JOptionPane("Printing...", 
                                                 JOptionPane.PLAIN_MESSAGE);
        JDialog dialog = pane.createDialog(this, "Print Status");
        // This listener object updates the dialog as the status changes
        job.addPrintJobListener(new PrintJobAdapter( ) {
                public void printJobCompleted(PrintJobEvent e) {
                    pane.setMessage("Printing complete.");
                }
                public void printDataTransferCompleted(PrintJobEvent e) {
                    pane.setMessage("Document transfered to printer.");
                }
                public void printJobRequiresAttention(PrintJobEvent e) {
                    pane.setMessage("Check printer: out of paper?");
                }
                public void printJobFailed(PrintJobEvent e) {
                    pane.setMessage("Print job failed");
                }
            });
        // Show the dialog, non-modal.
        dialog.setModal(false);
        dialog.show( );
        // Now print the Doc to the DocPrintJob
        try {
            job.print(doc, printAttributes);
        }
        catch(PrintException e) {
            // Display any errors to the dialog box
            pane.setMessage(e.toString( ));
        }
    }
} |