package javacodebook.media.print.graphic; import java.awt.*; import java.awt.print.*; import javax.swing.JPanel; /** * Ein Panel, dass eine Grafik auf sich selbst darstellt, in der Originalgröße. * Die Größe des Panels wird entsprechend angepasst, kann aber größer sein * als die Grafik, wenn das Panel von der umgebenden Komponente größer * gezogen wird (z.B. in einer JScrollPane, die größer ist als die Grafik). * Damit das Panel ausdruck-fähig ist, implementiert es das Interface * java.awt.print.Printable. Die Grafik wird immer auf max. einer Seite * ausgedruckt. */ public class PrintableImagePanel extends javax.swing.JPanel implements Printable{ //Die Grafik, die angezeigt werden soll private Image image; public PrintableImagePanel(Image image) { this.image = image; this.setBackground(Color.white);//evtl. treten sonst graue Ränder auf } /* * Hier wird die Grafik auf das Panel gezeichnet. Das Panel kann evtl. * größer sein als die Grafik, dann bleibt rechts oder unten ein grauer * Rand, der beim Druck nicht berücksichtigt wird. */ public void paintComponent(Graphics g) { super.paintComponent(g); g.drawImage(image, 0, 0, image.getWidth(this), image.getHeight(this), this); } /* Es wird die Größe der Grafik als PreferredSize zurückgegeben */ public Dimension getPreferredSize() { return new Dimension(image.getWidth(this), image.getHeight(this)); } /* Die print-Methode aus dem Interface Printable */ public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException { //Das Graphics-Objekt wird in ein Graphics2D-Objekt gecastet //um besser verarbeitet werden zu können Graphics2D g2 = (Graphics2D)graphics; //DoubleBuffering im Panel für den Druck ausschalten this.setDoubleBuffered(false); //Größe des Druckbereichs berechnen //Zunächst werden die Maße der Grafik ermittelt (in Pixel) double imageWidth = image.getWidth(this); double imageHeight = image.getHeight(this); //Jetzt werden die Papiermaße ermittelt, die das Papierformat //vorgibt double pageWidth = pageFormat.getImageableWidth(); double pageHeight = pageFormat.getImageableHeight(); double scale = 1; //Grafik kleiner als Papier: Masstab = 1 //Ist die Grafik breiter oder höher als das Papier, so muss sie skaliert //werden if(imageWidth > pageWidth || imageHeight > pageHeight) { if(imageWidth/imageHeight > pageWidth/pageHeight) //Grafik auf Papierbreite skalieren scale = pageWidth/imageWidth; else //Grafik auf Papierhöhe skalieren scale = pageHeight/imageHeight; } //Da die Voreinstellung beim Druck gerne "Seite 1 - 9999" //lautet, werden die vielen Leerseiten hier weggelassen. if(pageIndex > 0) return Printable.NO_SUCH_PAGE; //Der zu druckende Grafikbereich wird in die linke obere //Ecke des Druckbereichs der Papierseite verschoben, damit //werden die Seitenränder berücksichtigt g2.translate(pageFormat.getImageableX(), pageFormat.getImageableY()); //Evtl. nötige Skalierung durchführen g2.scale(scale, scale); //Grafikbereich für den Druck neu zeichnen paint(g2); //DoubleBuffering in der EditorPane wieder einschalten this.setDoubleBuffered(true); //Dem Druckjob mitteilen, dass eine Seite für den Druck //existiert return Printable.PAGE_EXISTS; } } --- Neue Klasse --- package javacodebook.media.print.graphic; import java.awt.*; import java.awt.print.*; import java.io.*; import javax.swing.*; /** * Diese Klasse dient als Rahmen, um ein Bild zu laden und auszudrucken. Ein * ImagePanel wird in einer JScrollPane dargestellt, ein einfaches Menü * ermöglich das Ansteuern der Aktionen Öffnen und Drucken. */ public class GraphicPrinter extends javax.swing.JFrame { private javax.swing.JMenuItem jMenuItem2; private javax.swing.JScrollPane scrollPane; private javax.swing.JFileChooser fileChooser; private javax.swing.JMenuItem jMenuItem1; private javax.swing.JMenu jMenu1; private javax.swing.JMenuBar jMenuBar1; PrintableImagePanel imagePanel = null; /** Creates new form GraphicPrinter */ public GraphicPrinter() { initComponents(); } /** * Komponenten werden erzeugt und auf dem JFrame positioniert. */ private void initComponents() { fileChooser = new javax.swing.JFileChooser(); scrollPane = new javax.swing.JScrollPane(); jMenuBar1 = new javax.swing.JMenuBar(); jMenu1 = new javax.swing.JMenu(); jMenuItem1 = new javax.swing.JMenuItem(); jMenuItem2 = new javax.swing.JMenuItem(); setTitle("Grafik Drucken"); addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent evt) { exitForm(evt); } }); getContentPane().add(scrollPane, java.awt.BorderLayout.CENTER); jMenu1.setText("Datei"); jMenuItem1.setText("\u00d6ffnen"); jMenuItem1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { openFile(evt); } }); jMenu1.add(jMenuItem1); jMenuItem2.setText("Drucken"); jMenuItem2.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { printFile(evt); } }); jMenu1.add(jMenuItem2); jMenuBar1.add(jMenu1); setJMenuBar(jMenuBar1); pack(); java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); setSize(new java.awt.Dimension(640, 480)); setLocation((screenSize.width-640)/2,(screenSize.height-480)/2); } /** * In der Methode printFile wird ein PrinterJob erzeugt und das ImagePanel * wird ausgedruckt. */ private void printFile(java.awt.event.ActionEvent evt) { try { PrinterJob job = PrinterJob.getPrinterJob(); job.setCopies(1); job.setPrintable(imagePanel); if(job.printDialog() == false) return;//kein Druck, da abgebrochen job.print(); } catch(PrinterException e) { e.printStackTrace(System.out); } } /** * Eine Grafikdatei öffnen und in der JScrollPane anzeigen. */ private void openFile(java.awt.event.ActionEvent evt) { int pressedButton = fileChooser.showOpenDialog(this); if(pressedButton == JFileChooser.APPROVE_OPTION) { File f = fileChooser.getSelectedFile(); ImageIcon icon = new ImageIcon(f.getAbsolutePath()); imagePanel = new PrintableImagePanel(icon.getImage()); scrollPane.getViewport().setView(imagePanel); this.repaint(); } } /** Beenden */ private void exitForm(java.awt.event.WindowEvent evt) { System.exit(0); } public static void main(String args[]) { new GraphicPrinter().show(); } }