2016-07-04 2 views
0

Как я могу захватить определенный компонент в моем приложении Java, а не мой полный первичный монитор?Класс робота - Снимок экрана с конкретным фреймом/компонентом, в то время как Java-приложение сведено к минимуму/в фоновом режиме

Текущий код пример того, как я собираю изображение:

Rectangle screenRect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()); 
    BufferedImage image = null; 
    try {//take the screenshot and store in buf img 
     image = new Robot().createScreenCapture(screenRect); 
    } catch (AWTException e2) { 
     e2.printStackTrace(); 
    } 

Пример компонентов, которые я хочу, чтобы снимок экрана будет JFrame, апплеты и JPanels. Пример с любым из них будет удовлетворительным при ответе на этот вопрос.

EDIT: Этот код решает проблему, позволяющую запускать и делать скриншоты при минимизации или в фоновом режиме. Благодаря Dando18.

public static BufferedImage createImage(JComponent comp) { 
    int w = comp.getWidth(); 
    int h = comp.getHeight(); 
    BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); 
    Graphics2D g = bi.createGraphics(); 
    comp.paint(g); 
    return bi; 
} 

Остальные вопросы:

  • Когда я сделать снимок экрана с помощью GetComponent или getContentPane на мой JFrame и передать его в функцию createImage она показывает каждый контроль/компонента и их содержание отображается на основном JFrame, но апплет не появится, даже если он показывает мне мою игру, и он отправляет обратно черные снимки экрана этой части.

Как он будет загружен в моем приложении:

Следующие условия для моего апплета.

  • апплета на главном JFrame
  • окурок апплета реализует AppletContext, AppletStub

Главная JFrame -> Вызовы класс с именем Loader и передает ему параметры -> Параметры передаются в мой класс Штук от Loader -> Апплет установлен на Stub -> Апплет добавлен в основное JFrame с центром.

Я не понимаю, почему этот компонент нельзя захватить вместе с другими на Главном JFrame. Я знаю, что Applet является компонентом awt, а не JComponent swing, и я попробовал только скриншот Applet, возвратив его из класса Loader и передав только Component для createImage, переопределяющего подпись, он, казалось, только захватил небольшое окно, которое было другим чем захват основного JFrame моего приложения, но тем не менее это было черное изображение.

+0

ли вы должны использовать 'Robot'? – Dando18

+0

IIRC JFrame имеет метод getRectangle(), и в этом случае я мог бы предположить, что использование этого в отличие от screenRect будет делать – jamierocks

+0

Робот вообще не требуется. Предложения открыты и приветствуются. –

ответ

2

Если вам не нужно использовать Robot, это должно возвращать BufferedImage компонента.

public static BufferedImage createImage(JComponent comp) { 
    int w = comp.getWidth(); 
    int h = comp.getHeight(); 
    BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); 
    Graphics2D g = bi.createGraphics(); 
    comp.paint(g); 
    return bi; 
} 

И просто позвонить:

BufferedImage component_screenshot = createImage(myComponent); 

Или с помощью Robot:

try { 
    BufferedImage img = new Robot().createScreenCapture(new Rectangle(
             frame.getLocationOnScreen().x, 
             frame.getLocationOnScreen().y, 
             frame.getWidth(), 
             frame.getHeight())); 
} catch (AWTException ex) { 
} 
+1

Этот подход не работает, если рендеринг области компонента зависит от другого компонента, который не является его дочерним элементом, например. компонент прозрачен. –

+0

@HeseinBurg второй подход не будет работать, если окно закрыто. Вы можете попробовать первый подход, понимая, что сказал Кодерино. – Dando18

+0

Первая часть, которую я получаю сейчас только в качестве основного приложения, но, к сожалению, не делает мой Java-апплет на снимках экрана, как предложил Кодерино. Я добавляю свой апплет в свой основной фрейм (тот, который я снимаю с экрана), все равно, чтобы исправить это? –