简体   繁体   中英

Graphics.drawimage not working Java 8

I have been using Graphics.drawImage for a very long time to render images, but after I installed java 8, it stopped working. There are no errors. I don't understand what's going on.

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;

public class Game implements Runnable {
    private BufferedImage img = new BufferedImage(10, 10, BufferedImage.TYPE_INT_ARGB);

    private boolean running;

    private Thread thread;

    private JFrame f;
    private Canvas c;

    public Game() {
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice[] gs = ge.getScreenDevices();
        for (GraphicsDevice gd : gs) {
            GraphicsConfiguration[] gc = gd.getConfigurations();
            for (GraphicsConfiguration gc1 : gc) {
                f = new JFrame("Title", gd.getDefaultConfiguration());
                c = new Canvas(gc1);
                f.getContentPane().add(c);
                f.setUndecorated(false);
                f.setIgnoreRepaint(true);
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setSize(700, 600);
                f.setResizable(false);
                f.setLocationRelativeTo(null);
                f.setFocusable(true);
                f.setVisible(true);
            }
        }
    }

    public void init() {
        img.getGraphics().drawImage(img, 0, 0, Color.BLACK, null);
    }

    @Override
    public void run() {
        long lastTime = System.nanoTime();
        double nsPerTick = 1000000000D / 60;

        int ticks = 0;
        int frames = 0;

        long lastTimer = System.currentTimeMillis();
        double delta = 0;

        init();

        while (running) {
            long now = System.nanoTime();
            delta += (now - lastTime) / nsPerTick;
            lastTime = now;
            boolean shouldRender = true;

            while (delta >= 1) {
                ticks++;
                tick();
                delta -= 1;
                shouldRender = true;
            }

            try {
                Thread.sleep(2);
            } catch (InterruptedException e) {
                System.out.println(e.getMessage());
            }

            if (shouldRender) {
                frames++;
                render();
            }

            if (System.currentTimeMillis() - lastTimer >= 1000) {
                lastTimer += 1000;
                frames = 0;
                ticks = 0;
            }
        }
    }

    public synchronized void start() {
        running = true;

        thread = new Thread(this, "GAME");
        thread.start();
    }

    public synchronized void stop() {
        running = false;

        try {
            thread.join();
        } catch (InterruptedException e) {
            System.out.println(e.getMessage());
        }
    }

    public static void main(String[] args) {
        new Game().start();
    }

    public void tick() { /*player movement, ect*/ }

    public void render() {
        c.createBufferStrategy(3);
        BufferStrategy bs = c.getBufferStrategy();

        Graphics g = bs.getDrawGraphics();
        g.drawImage(img, 100, 100, null);
        //I should also not that strings won't draw either.
        g.drawString("Hello, world", 50, 50);
        g.dispose();
        bs.show();
    }
}

I don't understand why this wouldn't be working, because it was working fine in java 7, and I did not make any changes to my code before or after I installed java 8. Also I am using a MacBook pro if that helps.

On Mac OS X version 10.9.4, I can verify that createBufferStrategy(2) works under Java 8, while createBufferStrategy(3) fails unless I revert to Java 7. As an aside, note that Swing GUI objects should be constructed and manipulated only on the event dispatch thread .

图片

As tested:

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import java.awt.EventQueue;

public class Game implements Runnable {
    private BufferedImage img = new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB);
    private boolean running;
    private Thread thread;
    private JFrame f;
    private Canvas c;

    public Game() {
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice[] gs = ge.getScreenDevices();
        for (GraphicsDevice gd : gs) {
            GraphicsConfiguration[] gc = gd.getConfigurations();
            for (GraphicsConfiguration gc1 : gc) {
                f = new JFrame("Title", gd.getDefaultConfiguration());
                c = new Canvas(gc1);
                f.add(c);
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.pack();
                f.setSize(360, 300);
                f.setLocationRelativeTo(null);
                f.setVisible(true);
            }
        }
    }

    public void init() {
        img.getGraphics().drawImage(img, 0, 0, Color.BLUE, null);
    }

    @Override
    public void run() {
        long lastTime = System.nanoTime();
        double nsPerTick = 1000000000D / 60;

        int ticks = 0;
        int frames = 0;

        long lastTimer = System.currentTimeMillis();
        double delta = 0;

        init();

        while (running) {
            long now = System.nanoTime();
            delta += (now - lastTime) / nsPerTick;
            lastTime = now;
            boolean shouldRender = true;

            while (delta >= 1) {
                ticks++;
                tick();
                delta -= 1;
                shouldRender = true;
            }

            try {
                Thread.sleep(2);
            } catch (InterruptedException e) {
                System.out.println(e.getMessage());
            }

            if (shouldRender) {
                frames++;
                render();
            }

            if (System.currentTimeMillis() - lastTimer >= 1000) {
                lastTimer += 1000;
                frames = 0;
                ticks = 0;
            }
        }
    }

    public synchronized void start() {
        running = true;
        thread = new Thread(this, "GAME");
        thread.start();
    }

    public synchronized void stop() {
        running = false;

        try {
            thread.join();
        } catch (InterruptedException e) {
            System.out.println(e.getMessage());
        }
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Game().start();
            }
        });
    }

    public void tick() { /*player movement, ect*/ }

    public void render() {
        c.createBufferStrategy(2);
        BufferStrategy bs = c.getBufferStrategy();
        Graphics g = bs.getDrawGraphics();
        g.drawImage(img, 100, 100, null);
        g.drawString("Hello, world: " + System.currentTimeMillis(), 50, 50);
        g.dispose();
        bs.show();
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM