打印整个程序布局

我使用Netbeans制作了一个Java程序(基于JFrame ),我想知道是否可以打印程序的布局

我希望有一个按钮并将function设置为“打印”,并且将打印框架的最终布局,是否可能? 如果是,任何参考来源?

这取决于你希望实现的目标。

您可以简单地将帧的内容打印到BufferedImage 。 这允许您控制要捕获的内容,因为您可以打印内容窗格而不是框架。

您可以使用Robot捕获屏幕。 这将捕获您尝试捕获的位置屏幕上的内容,其中可能包含更多内容…

“打印”与“捕获”

在此处输入图像描述在此处输入图像描述

 import java.awt.EventQueue; import java.awt.Graphics2D; import java.awt.GridBagLayout; import java.awt.Rectangle; import java.awt.Robot; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; import javax.imageio.ImageIO; import javax.swing.AbstractAction; import javax.swing.ActionMap; import javax.swing.InputMap; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.KeyStroke; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; public class PrintFrame { public static void main(String[] args) { new PrintFrame(); } public PrintFrame() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { } JLabel label = new JLabel("Clap if you're happy"); final JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new GridBagLayout()); frame.add(label); frame.setSize(200, 200); frame.setLocationRelativeTo(null); InputMap im = label.getInputMap(JLabel.WHEN_IN_FOCUSED_WINDOW); ActionMap am = label.getActionMap(); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_P, KeyEvent.CTRL_DOWN_MASK), "Print"); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_P, KeyEvent.CTRL_DOWN_MASK | KeyEvent.ALT_DOWN_MASK), "PrintAll"); am.put("Print", new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { try { System.out.println("Print..."); BufferedImage img = new BufferedImage(frame.getWidth(), frame.getHeight(), BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = img.createGraphics(); frame.printAll(g2d); g2d.dispose(); ImageIO.write(img, "png", new File("Print.png")); } catch (IOException ex) { ex.printStackTrace(); } } }); am.put("PrintAll", new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { try { System.out.println("PrintAll..."); Robot bot = new Robot(); Rectangle bounds = frame.getBounds(); bounds.x -= 2; bounds.y -= 2; bounds.width += 4; bounds.height += 4; BufferedImage img = bot.createScreenCapture(bounds); ImageIO.write(img, "png", new File("PrintAll.png")); } catch (Exception ex) { ex.printStackTrace(); } } }); frame.setVisible(true); } }); } } 

更新了更好的要求

基本要求并没有太大变化。 你还需要捕捉一些如何…

在这里,我通过“print”代码修改了将生成的BufferedImage发送到打印机。 注意,我没有检查图像是否真的适合,我相信你可以解决这个问题;)

 am.put("Print", new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { try { System.out.println("Print..."); BufferedImage img = new BufferedImage(frame.getWidth(), frame.getHeight(), BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = img.createGraphics(); frame.printAll(g2d); g2d.dispose(); PrinterJob pj = PrinterJob.getPrinterJob(); pj.setPrintable(new FramePrintable(img)); if (pj.printDialog()) { pj.print(); } } catch (Exception ex) { ex.printStackTrace(); } } }); 

然后,您只需要一些方法来实际将内容呈现给打印机……

 public class FramePrintable implements Printable { private BufferedImage img; public FramePrintable(BufferedImage img) { this.img = img; } @Override public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException { if (pageIndex == 0) { Graphics2D g2d = (Graphics2D) graphics; g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY()); double x = (pageFormat.getImageableWidth() - img.getWidth()) / 2; double y = (pageFormat.getImageableHeight()- img.getHeight()) / 2; g2d.drawImage(img, (int)x, (int)y, null); } return pageIndex == 0 ? PAGE_EXISTS : NO_SUCH_PAGE; } } 

这几乎可以直接来自Printing试用……

最简单的方法是使用可以在给定坐标处捕获屏幕片段的类Robot 。 看看这个讨论: Java打印屏幕程序

只需向机器人发送JFrame的绝对坐标即可

尝试截取屏幕截图并将其保存到文件中。 然后你可以打印文件。 以下代码段可用于截取屏幕截图:

 boolean captureScreenShot() { boolean isSuccesful = false; Rectangle screenRect = new Rectangle(0,0,500,500);//frame absolute coordinates BufferedImage capture; try { capture = new Robot().createScreenCapture(screenRect); // screen shot image will be save at given path with name "screen.jpeg" ImageIO.write(capture, "jpg", new File( "c:\\abc", "screen.jpeg")); isSuccesful = true; } catch (AWTException awte) { awte.printStackTrace(); isSuccesful = false; } catch (IOException ioe) { ioe.printStackTrace(); isSuccesful = false; } return isSuccesful; }