首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将JFrame内容另存为.png

将JFrame内容另存为.png
EN

Stack Overflow用户
提问于 2019-05-19 22:02:17
回答 3查看 327关注 0票数 1

我目前正在用Java开发一个2D游戏(我使用的是JFrame)。我想,当某个按钮被按下时,保存框架的内容并将其存储在图像中。目前,我使用以下代码:

代码语言:javascript
复制
Robot robot = new Robot();
Rectangle screenSize = new Rectangle(display.getFrame().getX() + 3, display.getFrame().getY() + 26, handler.getWidth(), handler.getHeight());

BufferedImage screenShot = robot.createScreenCapture(screenSize);   ImageIO.write(screenShot,File("D:\\Programming\\First2DGame\\res\\textures\\Screenshot.png"));

问题是,这需要屏幕的一部分的屏幕截图,而不是帧本身的。这意味着,例如,如果我将窗口移动到屏幕的右下角,我会收到一个不一致的通知,然后我按下我的按钮,通知将出现在屏幕截图中。

我已经搜索过了,我试过这段代码:

代码语言:javascript
复制
 try
        {
            BufferedImage image = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB);
            Graphics2D graphics2D = image.createGraphics();
            frame.paint(graphics2D);
            ImageIO.write(image,"jpeg", new File("D:\\Programming\\First2DGame\\res\\textures\\Screenshot.png"));
        }
        catch(Exception e)
        {
            e.printStackTrace;
        }
    }

    protected void paintComponent(Graphics g)
    {
        g.drawRect(50,50,50,50);
    }

但是结果是一个白色的窗口:

您可能知道如何创建仅 frame的屏幕截图

EN

回答 3

Stack Overflow用户

发布于 2019-05-20 00:03:24

我认为你展示的示例代码是非常正确的。

你能用下面的代码测试它吗?:D如果你像你所展示的那样删除contentPane.printAll(g2d),只有白色窗口

代码语言:javascript
复制
public class ImageSaveTest extends JFrame {

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

    public ImageSaveTest() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(new BorderLayout());

        JPanel panel = new JPanel();
        panel.setPreferredSize(new Dimension(300, 300));
        panel.setLayout(new GridBagLayout());

        JLabel label = new JLabel("Hello! StackOverflow(Press Enter)");
        label.setFont(new Font("Default", Font.BOLD, 15));

        panel.add(label);
        add(panel);
        setVisible(true);
        pack();

        addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                System.out.println(e.getKeyCode());
                if(e.getKeyCode() == KeyEvent.VK_ENTER) {
                    try {
                        Container contentPane = getContentPane();
                        BufferedImage image = new BufferedImage(contentPane.getWidth(), contentPane.getHeight(),
                                BufferedImage.TYPE_INT_RGB);
                        Graphics2D g2d = image.createGraphics();
                        contentPane.printAll(g2d);
                        g2d.dispose();

                        // replace this path to your image
                        ImageIO.write(image, "jpeg", new File("Your Path/Print.png"));
                    } catch (IOException ex) {
                        // Exception Handling
                    }
                }
            }
        });
    }
}
票数 1
EN

Stack Overflow用户

发布于 2019-05-24 21:34:20

Update我做了一些研究,正如我想的那样,解决方案是我应该通过覆盖JFrame上的paintComponent()方法来呈现所有内容(我想)。目前我真的不知道怎么做,但我想我应该能够修复它。在接下来的几天里我会很忙,但我会告诉你我什么时候能让它工作!

票数 0
EN

Stack Overflow用户

发布于 2019-06-20 03:02:23

下面是我的代码(我知道,它很长):

代码语言:javascript
复制
package dev.patatonzolo.first2Dgame;

import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseEvent;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
import dev.patatonzolo.first2Dgame.display.Display;
import dev.patatonzolo.first2Dgame.gfx.Assets;
import dev.patatonzolo.first2Dgame.gfx.GameCamera;
import dev.patatonzolo.first2Dgame.playerInput.KeyManager;
import dev.patatonzolo.first2Dgame.playerInput.MouseInput;
import dev.patatonzolo.first2Dgame.ppes.GaussianBlur;
import dev.patatonzolo.first2Dgame.states.GameState;
import dev.patatonzolo.first2Dgame.states.IgMenuState;
import dev.patatonzolo.first2Dgame.states.MainMenuState;
import dev.patatonzolo.first2Dgame.states.OpeningState;
import dev.patatonzolo.first2Dgame.states.OptionsState;
import dev.patatonzolo.first2Dgame.states.QuitState;
import dev.patatonzolo.first2Dgame.states.State;

public class Game extends JPanel implements Runnable {

    private Display display;
    private int width;
    private int height;
    public String title;
    protected int ticks = 0;

    private Thread thread;

    private boolean running = false;
    private BufferStrategy bufferStrategy;
    private Graphics2D graphics2d;

    public State gameState;
    public State openingState;
    public State igMenuState;
    public State mainMenuState;
    public State optionsState;
    public State quitState;

    private KeyManager keyManager;
    private MouseInput mouseInput;

    private GameCamera gameCamera;

    private Handler handler;


    public Game(String title, int width, int height) {
        this.width = width;
        this.height = height;
        this.title = title;
        keyManager = new KeyManager();
        mouseInput = new MouseInput();
    }

    private void takeScreenshot() {
        try {
        Container contentPane = display.getFrame().getContentPane();
        BufferedImage image = new BufferedImage(contentPane.getWidth(), contentPane.getHeight(),
                BufferedImage.TYPE_INT_RGB);
        Graphics2D g2d = image.createGraphics();
        contentPane.printAll(g2d);
        g2d.dispose();

        ImageIO.write(image, "png", new File("C:\\Users\\VgRig\\eclipse-workspace\\First2DGame\\res\\textures\\screenshot.png"));
    } catch (IOException e) {
        e.printStackTrace();
        }
    }

    @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D)g;

      }

    private void init() {
        display = new Display(title, width, height);
        display.getFrame().addKeyListener(keyManager);
        display.getFrame().addMouseListener(mouseInput);
        display.getFrame().addMouseMotionListener(mouseInput);
        display.getCanvas().addMouseListener(mouseInput);
        display.getCanvas().addMouseMotionListener(mouseInput);
        Assets.init();

        handler = new Handler(this);
        gameCamera = new GameCamera(handler, 0, 0);
        gameState = new GameState(handler);
        openingState = new OpeningState(handler);
        igMenuState = new IgMenuState(handler);
        mainMenuState = new MainMenuState(handler);
        optionsState = new OptionsState(handler);
        quitState = new QuitState(handler);
        State.setState(gameState);

    }

    public void update() {
        keyManager.update();
        mouseInput.update();
        if(State.getState() != null) {
            State.getState().update();
        }

        if(handler.getKeyManager().right) {
        }

        // MENUS 
        if(handler.getKeyManager().menu) {
            takeScreenshot();
            //GaussianBlur.Blur();
            State.setState(igMenuState);
        }
        if(State.getState() == gameState && handler.getKeyManager().menu) {
            State.setState(gameState);
        }

        if(State.getState() != igMenuState) {
            IgMenuState.currentSelection = 4;
        }
        if(State.getState() != quitState) {
            QuitState.currentSelection = 2;
        }

    }

    private void render() {
        bufferStrategy = display.getCanvas().getBufferStrategy();
        if(bufferStrategy == null) {
            display.getCanvas().createBufferStrategy(3);
            return;
        }
        graphics2d = (Graphics2D) bufferStrategy.getDrawGraphics();
        graphics2d.clearRect(0, 0, width, height);

        if(State.getState() != null) {
            State.getState().render(graphics2d);
        }

        bufferStrategy.show();
        graphics2d.dispose();

    }

    public void run() { 
        init();

        int fps = 60;
        double timePerTick = 1000000000 / fps;
        double delta = 0;
        long now;
        long lastTime = System.nanoTime();
        long framePerSecond = 0;

        while(running) {
            now = System.nanoTime();
            delta += (now - lastTime) / timePerTick;
            framePerSecond += now - lastTime;
            lastTime = now;

            if(delta >= 1) {
                update();
                render();
                ticks ++;
                delta --;
            }

            if(framePerSecond >= 1000000000) {
                System.out.println("Game running at [" + ticks + " FPS]");
                ticks = 0;
                framePerSecond = 0;
            }
        }       

        stop();
    }

    public int getTicks() {
        return ticks;
    }

    public void setTicks(int ticks) {
        this.ticks = ticks;
    }

    public KeyManager getKeyManager() {
        return keyManager;
    }

    public MouseInput getMouseInput() {
        return mouseInput;
    }

    public GameCamera getGameCamera() {
        return gameCamera;
    }

    public int getWidth() {
        return width;
    }

    public int getHeight() {
        return height;
    }

    public synchronized void start() {
        if(running)
            return;
        running = true;
        thread = new Thread(this);
        thread.start();
    }

    public synchronized void stop() {
        if(running = false)
            return;
        running = false;
        try {
            thread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56208544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档