Полноэкранные скриншоты Java - PullRequest
4 голосов
/ 23 февраля 2012

Я работаю над игровым проектом и написал некоторый базовый код, позволяющий запускать игру в полноэкранном режиме.

Моя проблема в том, что, пока игра находится в полноэкранном режиме, я не могу нажать Prnt Scrn, чтобы сделать скриншоты!Если я пытаюсь сделать снимок экрана, он просто показывает все, что находится за полноэкранным окном игры.Есть идеи, почему это не работает?

Я работаю на Windows 7. Вот SSCCE, иллюстрирующий мою проблему:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class FullscreenScreenShotSSCCE extends JFrame
{
    private JPanel screenP;

    private GraphicsDevice grDev;

    /**
    *   Constructor
    *   Preconditions: None.
    *   Postconditions: The window for the SSCCE is created.
    **/

    public FullscreenScreenShotSSCCE()
    {
        super("Fullscreen Prnt Scrn problem SSCCE");
        int screenX = 640;  
        int screenY = 480;
        this.setSize(screenX,screenY);

        // set up resolution change mode

        grDev = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); // obtains your graphics device

        // setup the game for full-screen if requested.

        System.out.println("Trying to start program in Fullscreen mode.");

        if(grDev.isFullScreenSupported()) // makes sure fullscreen is supported before doing anything.
        {
            System.out.println("FullScreen is supported");
            this.setUndecorated(true);
            DisplayMode resChangeMode = new DisplayMode(640,480,32,DisplayMode.REFRESH_RATE_UNKNOWN); // create new DisplayMode with different resolution.

            try
            {
                grDev.setFullScreenWindow(this); // set fullscreen mode on. Otherwise this won't work
                grDev.setDisplayMode(resChangeMode); // change DisplayMode to our new resolution.
                System.out.println("Change resolution: Success!");
            }
            catch(Exception e)
            {
                System.out.println("Change resolution: FAIL!");
            }
        }
        this.setExtendedState(MAXIMIZED_BOTH);

        // instantiate main panel

        screenP = new SSCCEPanel();
        this.add(screenP);

        // finishing touches on Game window

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);

        System.out.println("Game Window successfully created!!!");
    }


    public static void main(String[] args)
    {
        FullscreenScreenShotSSCCE gui = new FullscreenScreenShotSSCCE();        
    }
}




/**
*   SSCCEPanel is the JPanel that manages the example's timer, painting, and logic. 
**/

class SSCCEPanel extends JPanel
{
    private Timer timer;
    public double prevFPS;
    boolean timerReady;

    // The SoundPlayer object is used by the example to play the sounds.

    public SSCCEPanel()
    {
        super(true);
    }

    /**
    *   repaints the SSCCE.
    *   This just shows the current FPS and the number of sounds currently playing.
    **/

    public void paintComponent(Graphics g)
    {
            super.paintComponent(g);

            Graphics2D g2D = (Graphics2D) g;
            g2D.setColor(new Color(0x000000));
            g2D.drawString("Java fullscreen!", 20,20);
            g2D.drawString("Try to take a screenshot!", 20,40);
            g.dispose();
    }
}

Ответы [ 5 ]

1 голос
/ 05 сентября 2012

Нет необходимости в каких-либо других классах. При нажатии PRINTSCREEN визуализируйте вашу игру на BufferedImage и сохраните ее, используя ImageIO.

Как сохранить изображения. http://docs.oracle.com/javase/tutorial/2d/images/saveimage.html

1 голос
/ 23 февраля 2012

Попробуйте Alt-PrintScreen (захватывает текущее окно).Это может помочь в полноэкранном эксклюзивном режиме.Удачи: -)

0 голосов
/ 06 мая 2012

Проблема остается нерешенной.В заключение, проблема, вероятно, присуща графическим устройствам / драйверам моей машины, поскольку другие пользователи не могут воспроизвести проблему, с которой я столкнулся.Поэтому эту проблему больше не стоит решать на нативной Java.

0 голосов
/ 04 марта 2012

Вы можете попробовать java.awt.Robot:

    try
    {
        Robot pixelGrabber = new Robot ();
        java.awt.image.BufferedImage bi = pixelGrabber.createScreenCapture (new Rectangle (0, 0, 1024, 768));
    }
    catch (AWTException ex)
    {
        ex.printStackTrace ();
    }

Вы должны настроить 1024, 768 в соответствии с настройками экрана, а затем искать способ динамического получения размера экрана.

0 голосов
/ 04 марта 2012

Попробуйте ctrl + alt + PrtScrn, если это работает.

...