2013-05-24 2 views
0

Я сделал программу Java (JFrame основе) с использованием Netbeans, Я хотел бы знать, если можно распечатать макет программыпечати вся программа раскладка

Я желаю иметь кнопку и установить функция «распечатать» и окончательная компоновка кадра будет напечатана, возможно ли это? Если да, то какой-либо источник ссылки?

+0

я имею в виду его с помощью печати на принтере, не PrintScreen –

ответ

1

Это будет зависеть от того, что вы надеетесь достичь.

Вы можете просто распечатать содержимое рамки до BufferedImage. Это позволяет вам контролировать то, что вы хотите захватить, тем, что вы можете распечатать область содержимого вместо кадра.

Чтобы захватить экран, вы можете использовать Robot. Это будет захватить то, что когда-либо на экране в том месте, вы пытаетесь захватить, который может включать в себя больше, чем просто фрейме ...

«Print» против «захвата»

enter image description hereenter image description here

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); 

      } 
     }); 
    } 
} 

Обновленный с лучшими требованиями

основное требование не меняется много. Вам все еще нужно захватить экран каким-то образом ...

Здесь я изменил код «печать», чтобы отправить полученный результат 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 суда ...

+0

я имею в виду его с помощью печати на принтере , а не printscreen –

+0

Итак, теперь у вас есть «BufferedImage», вы можете использовать «Printable» для печати, см. [Печать] (http://docs.oracle.com/javase/tutorial/2d/printing/) для некоторых идей;) – MadProgrammer

+0

Обновлено с примером «печати» – MadProgrammer

1

Самый простой способ - использовать класс Robot, который может захватывать фрагмент экрана при заданных координатах. Посмотрите на эту дискуссию: Java print screen program

Просто отправить роботу абсолютные координаты вашего JFrame

+0

я имею в виду его с помощью печати на принтере, не PrintScreen –

0

Попробуйте сделать скриншот и сохранить его в файл. Затем вы можете распечатать файл. Следующий фрагмент кода может быть использован, чтобы сделать скриншот:

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; 
} 
+0

Я имею в виду его использование на принтере, а не на принтере –

+0

«screen.png» содержит рамку, которую вы хотите распечатать. Теперь вы можете распечатать этот файл («screen.png») на принтере. Google это. – Rishabh

+0

, но он содержит панель заголовка с иконкой «_ 口 X», правильно? –

Смежные вопросы