2014-10-15 4 views
0

없이 나는 현재 일시 정지 메뉴의 배경으로 사용하기 위해 내 프로그램에서 무슨 일이 일어나고 있는지의 스크린 샷을 찾고 있어요.캡처 스크린 샷 국경

스크린 샷을 수행하고 잘 작동
BufferedImage x = robot.createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize())); 

는 것은 그것은 또한 확실히 포함되어서는 안 내 Windows 국경이 포함되어 있습니다 : 나는 코드를 발견했습니다. 나는 웹 주위를 기웃 거리며 경계선 안쪽에있는 스크린 샷을 찍는 기능을 보지 못했다. 또는 상단, 하단 및 측면의 경계선 두께를 찾는 것도 효과가 있지만 그 정보를 찾지 못했습니다.

가장 좋은 방법은 무엇입니까?

답변

2

대신 프레임 경계를 캡처, 당신은 당신은 단지 물리적 내용을 원하는 경우, 당신은해야뿐만 아니라

JRootPane rootPane = frame.getRootPane(); 
Rectangle bounds = new Rectangle(rootPane.getSize()); 
bounds.setLocation(rootPane.getLocationOnScreen()); 
BufferedImage contentsImage = bot.createScreenCapture(bounds); 

이 캡처합니다 ... 예를 들어, 대신 내용을 캡처 메뉴 표시 줄을 시도해야 대신 예를 들어 frame.getRootPane()

frame.getContentPane() ...

원래 프레임을 사용
Original

캡처 결과 (전체 프레임/루트 창)
Capture

이상하게
import java.awt.AWTException; 
import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.GridLayout; 
import java.awt.Rectangle; 
import java.awt.Robot; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
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.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JRootPane; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class ScreenShot { 

    public static void main(String[] args) { 
     new ScreenShot(); 
    } 

    public ScreenShot() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       final JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 

       JButton capture = new JButton("Snap shot"); 
       capture.addActionListener(new ActionListener() { 
        @Override 
        public void actionPerformed(ActionEvent e) { 
         try { 
          Robot bot = new Robot(); 
          BufferedImage frameImage = bot.createScreenCapture(frame.getBounds()); 
          JRootPane rootPane = frame.getRootPane(); 
          Rectangle bounds = new Rectangle(rootPane.getSize()); 
          bounds.setLocation(rootPane.getLocationOnScreen()); 
          BufferedImage contentsImage = bot.createScreenCapture(bounds); 

          JPanel panel = new JPanel(new GridLayout(1, 2)); 
          panel.add(new JLabel(new ImageIcon(frameImage))); 
          panel.add(new JLabel(new ImageIcon(contentsImage))); 

          JOptionPane.showMessageDialog(frame, panel); 

         } catch (AWTException ex) { 
          ex.printStackTrace(); 
         } 
        } 
       }); 

       frame.add(capture, BorderLayout.SOUTH); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 

      setLayout(new BorderLayout()); 

      try { 
       BufferedImage img = ImageIO.read(new File("C:\\Users\\shane\\Dropbox\\Ponies\\sillydash-small.png")); 
       JLabel label = new JLabel(new ImageIcon(img)); 
       add(label); 
      } catch (IOException ex) { 
       ex.printStackTrace(); 
      } 

     } 

    } 

} 

, 당신은 당신이 원하는 거의 모든 구성 요소에 대해이 방법을 사용할 수 있습니다 ...

+0

완벽하게 작동했습니다! 나는 크기와 위치에 대해 rootPane을 사용하는 것을 잊어 버렸습니다. 모든 것을 포함하고 국경 간의 모든 것을 포함하는 어떤 객체가 있어야한다는 것을 알고있었습니다. 어느 것을 기억하지 못했습니다! 감사! – Nathan

+0

도움이 되니 기쁩니다 ... – MadProgrammer

0

당신은 당신의 자신의 기능을 시도 할 수 있습니다 : 그것은 당신의 요구에 맞게해야하므로

public static final void makeScreenshot(JFrame f) { 
    Rectangle rec = f.getBounds(); 
    BufferedImage bufferedImage = new BufferedImage(rec.width, rec.height, 
      BufferedImage.TYPE_INT_ARGB); 
    f.paint(bufferedImage.getGraphics()); 

    try { 
     // Create temp file 
     File temp = File.createTempFile("screenshot", ".png"); 

     ImageIO.write(bufferedImage, "png", temp); 

     // Delete temp file on exit 
     temp.deleteOnExit(); 
    } catch (IOException ioe) { 
     LOGGER.debug(ioe.toString()); 
    } 
} 

이, 프레임 자체 또는 제목 표시 줄에 포함되지 않습니다.

편집 샷을 저장하는 것을 포함하여 편집되었습니다.

+0

는'JFrame의 # getBounds'은 프레임을 포함하지 보드의 바깥 쪽 가장자리를 나타냅니다. 그 외 모든 것은 그 안에 표시됩니다. 모양과 느낌에 따라 다른 설정은'페인트 '가 무엇을 할 것인가에 달려 있지만'print' 또는'printAll '페인트가 더 효율적이고 더블 버퍼링을 사용하지 않기 때문에. – MadProgrammer

+0

아, 분명히, '페인트'는 국경을 페인트하지 않습니다, 거기에 있습니다,하지만 나는 다른 수정을 제안 할 것입니다. 도움이 될 것입니다 (예 :'paint' 대신'print');) – MadProgrammer