2013-05-08 30 views
0

我已经用Java创建一个GUI,它有一个按钮的名称打印....在打印图形用户界面也得到正确打印,但它需要很长的时间来打印....请帮我如何减少等待时间。谢谢的Java GUI印刷

我使用下面的代码打印

public void actionPerformed(ActionEvent ae) 
{ 
    if (ae.getSource() == bprint) 
    { 
     PrinterJob job = PrinterJob.getPrinterJob(); 
     job.setPrintable(this); 
     boolean ok = job.printDialog(); 
     System.out.println("here"); 
     if (ok) 
     { 
      try 
      { 
       job.print(); 
      } 
      catch (PrinterException ex) 
      { 
       System.out.println(ex); 
      } 
     } 
    } 

} 

public int print(Graphics g, PageFormat pf, int page) throws PrinterException 
{ 

    if (page > 0) 
    { 
     return NO_SUCH_PAGE; 
    } 

    Graphics2D g2d = (Graphics2D)g; 
    g2d.translate(pf.getImageableX(), pf.getImageableY()); 

    p1.printAll(g); 

    return PAGE_EXISTS; 
} 

回答

1

这需要很长的时间来打印。您可以通过在单独的线程中执行打印来缩短运行时间。

你要传递的JFrame(打印整个GUI)或Swing组件要打印的打印线。

printButton.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent event) { 
      new Thread(new PrintActionListener(frame)).start(); 
     } 
    }); 

这里是我的打印机线程

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.JPanel; 

import com.ggl.sudoku.solver.view.SudokuFrame; 

public class PrintActionListener implements Runnable { 

    private SudokuFrame frame; 

    public PrintActionListener(SudokuFrame frame) { 
     this.frame = frame; 
    } 

    @Override 
    public void run() { 
     final BufferedImage image = createPanelImage(); 

     PrinterJob printJob = PrinterJob.getPrinterJob(); 
     printJob.setPrintable(new ImagePrintable(printJob, image)); 

     if (printJob.printDialog()) { 
      try { 
       printJob.print(); 
      } catch (PrinterException prt) { 
       prt.printStackTrace(); 
      } 
     } 
    } 

    private BufferedImage createPanelImage() { 
     JPanel panel = frame.getSudokuPanel(); 
     BufferedImage image = new BufferedImage(panel.getWidth(), 
       panel.getHeight(), BufferedImage.TYPE_INT_RGB); 
     Graphics2D g = image.createGraphics(); 
     panel.paint(g); 
     g.dispose(); 
     return image; 
    } 

    public class ImagePrintable implements Printable { 

     private double   x, y, width; 

     private int    orientation; 

     private BufferedImage image; 

     public ImagePrintable(PrinterJob printJob, BufferedImage image) { 
      PageFormat pageFormat = printJob.defaultPage(); 
      this.x = pageFormat.getImageableX(); 
      this.y = pageFormat.getImageableY(); 
      this.width = pageFormat.getImageableWidth(); 
      this.orientation = pageFormat.getOrientation(); 
      this.image = image; 
     } 

     @Override 
     public int print(Graphics g, PageFormat pageFormat, int pageIndex) 
       throws PrinterException { 
      if (pageIndex == 0) { 
       int pWidth = 0; 
       int pHeight = 0; 
       if (orientation == PageFormat.PORTRAIT) { 
        pWidth = (int) Math.min(width, (double) image.getWidth()); 
        pHeight = pWidth * image.getHeight()/image.getWidth(); 
       } else { 
        pHeight = (int) Math.min(width, (double) image.getHeight()); 
        pWidth = pHeight * image.getWidth()/image.getHeight(); 
       } 
       g.drawImage(image, (int) x, (int) y, pWidth, pHeight, null); 
       return PAGE_EXISTS; 
      } else { 
       return NO_SUCH_PAGE; 
      } 
     } 

    } 

}