2013-08-25 117 views
0

我想打印一個BufferedImage,我不知道如何打印所有內容。
代碼似乎工作正常,除了它也打印框架和打印按鈕的邊框,而不僅僅是打算的內容。
質量也因爲某種原因變成了狗屎。可打印打印整個框架而不是內容

這是我寫它的代碼:

package frik.main; 

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.image.BufferedImage; 
import java.awt.print.PageFormat; 
import java.awt.print.Printable; 
import java.awt.print.PrinterException; 
import java.awt.print.PrinterJob; 

import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 

import java.awt.event.*; 

import javax.swing.*; 
import frik.data.Config; 
import frik.utils.ImgUtil; 

public class Previewer implements Config, Printable, ActionListener{ 

    private JFrame Frame; 
    private JPanel ImagePanel; 
    private JLabel PicLabel; 
    private JButton PrintButton; 
    private static BufferedImage before; 
    private static boolean Scaled; 

    public Previewer(BufferedImage Image, boolean scaled){ 
     this.before = Image; 
     this.Scaled = scaled; 
     loop(); 

    } 

    public int print(Graphics g, PageFormat pf, int page) throws PrinterException{ 
     if (page > 0) { 
      return Printable.NO_SUCH_PAGE; 
     } 
     Graphics2D g2d = (Graphics2D)g; 
     g2d.translate(pf.getImageableX(), pf.getImageableY()); 

     Frame.printAll(g); 

     return Printable.PAGE_EXISTS; 
    } 

    public void actionPerformed(ActionEvent e){ 
     PrinterJob job = PrinterJob.getPrinterJob(); 
     job.setPrintable(this); 
     boolean ok = job.printDialog(); 
     if (ok) { 
      try { 
       job.print(); 
      } catch (PrinterException ex) { 
       JOptionPane.showMessageDialog(null, "The Printjob did not successfully complete.", "Print Failure.", JOptionPane.WARNING_MESSAGE); 
      } 
     } 
    } 

    public void loop(){ 
     UIManager.put("swing.boldMetal", Boolean.FALSE); 
     Frame = new JFrame("Mold Preview"); 
     ImagePanel = new JPanel(); 
     PrintButton = new JButton("Print Mold"); 

     Frame.addWindowListener(new WindowAdapter() { 
       public void windowClosing(WindowEvent e) {System.exit(0);} 
      }); 

     if(Scaled){ 
      PicLabel = new JLabel(new ImageIcon(ImgUtil.scaleImage(PAPER_WIDTH/3, PAPER_HEIGHT/3, before))); 
     }else if (!Scaled){ 
      PicLabel = new JLabel(new ImageIcon(before)); 
     } 

     ImagePanel.setBackground(Color.orange); 
     ImagePanel.add(PicLabel); 
     Frame.add("Center", ImagePanel); 

     PrintButton.addActionListener(this); 
     Frame.add("North", PrintButton); 

     Frame.pack(); 
     Frame.setVisible(true); 
     Frame.setResizable(false); 

    } 

    public static void main(String args[]){ 
     new Previewer(before, Scaled); 
     ////////////////////////////// 
    } 
} 

因此,如果有人可以幫我打印只是BufferedImage的,或只是ImageIcon的持有的BufferedImage那將是巨大的。

回答

3

那麼,如果您只關心打印圖像,爲什麼要撥打Frame.printAll(g)?相反,這樣做的,只是嘗試繪製圖像:

g.drawImage(Image, x, y, null);

+0

呀,它的工作原理,但由於某種原因,當我這樣做,打印的結果是大的紙張。有什麼建議麼? –

+0

也許你應該嘗試調整圖像大小。 –