Java:图像不显示

时间:2016-01-26 01:20:08

标签: java swing graphics

我正在制作一个我需要显示图像的程序。我正在使用ImageIcon和Image类来执行此操作。我在构造函数中声明了ImageIcon,然后通过i.getImage()分配了图像值。除了图像之外的所有东西似乎都很好。这是我的代码:

更新:我将图像放在与代码相同的目录中。我使用的是Mac,我尝试了#34; image.png"," ./ image.png","用户/ myStuff / Documents / workspace / Game / src / image .PNG&#34 ;.其中之一已经奏效了。

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.ImageIcon;
import javax.swing.JFrame;

@SuppressWarnings("serial")
public class Game extends JFrame {

    int x = 100, y = 100;

    private Image dbimage;
    private Graphics dbg;

    Image image;

    class AL extends KeyAdapter {

        public void keyPressed(KeyEvent e) {
            int keyCode = e.getKeyCode();
            if (keyCode == e.VK_LEFT) {
                if (x <= 20) {
                    x = 20;
                } else {
                    x -= 5;
                }
            } else if (keyCode == e.VK_RIGHT) {
                if (x >= 230) {
                    x = 230;
                } else {
                    x += 5;
                }
            } else if (keyCode == e.VK_UP) {
                if (y <= 20) {
                    y = 20;
                } else {
                    y -= 5;
                }
            } else if (keyCode == e.VK_DOWN) {
                if (y >= 230) {
                    y = 230;
                } else {
                    y += 5;
                }
            }
        }

    }

    public Game() {

        //load up image
        ImageIcon i = new ImageIcon("image.png");
        image = i.getImage();

        //set up properties
        addKeyListener(new AL());
        setTitle("Game");
        setSize(250, 250);
        setResizable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBackground(Color.CYAN);
        setVisible(true);

    }

    public void paint(Graphics g) {
        dbimage = createImage(getWidth(), getHeight());
        dbg = dbimage.getGraphics();
        paintComponent(dbg);
        g.drawImage(dbimage, 0, 0, this);
    }

    public void paintComponent(Graphics g) {
        g.setFont(new Font("Arial", Font.BOLD | Font.ITALIC, 30));
        g.setColor(Color.MAGENTA);
        g.drawString("Hello World!", 50, 50);
        g.setColor(Color.RED); 
        g.drawImage(image, 100, 100, this);
        repaint();
    }

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

}

1 个答案:

答案 0 :(得分:2)

上面的代码存在重大问题......

首先,如果您的图片与您的班级文件一起使用,那么请不要将其作为文件,而是将其作为MadProg显示的资源(并且此网站上的大多数类似问题会告诉您):

    // get your image as a resource
    URL resource = Game.class.getResource(RESOURCE_PATH);
    BufferedImage img = null;
    try {
        // read in using ImageIO
        img = ImageIO.read(resource);
    } catch (IOException e) {
        e.printStackTrace();
        System.exit(-1);
    }

接下来,永远不要直接在JFrame中绘制,当然也不要在其paint方法中绘制。相反,查看Swing绘图教程并按照他们的主题:在JPanel的paintComponent方法中绘制,但只有在调用super的paintComponent方法之后才能使绘画继续沿着绘画链的一行。:

// draw within the paintComponent method, not the paint method
@Override
protected void paintComponent(Graphics g) {
    // call the super's method to all painting to chain down the line
    super.paintComponent(g);
    if (dbimage != null) {
        g.drawImage(dbimage, imgX, imgY, this);
    }
}

我更喜欢在修复GUI的大小时覆盖JPanel的getPreferredSize,例如:

// set the preferred size of the main Game JPanel safely 
@Override
public Dimension getPreferredSize() {
    if (isPreferredSizeSet()) {
        return super.getPreferredSize();
    }
    return new Dimension(PREF_W, PREF_H);
}

将所有内容放在一起,可能会工作:

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.*;

public class Game extends JPanel {
    public static final String RESOURCE_PATH = "image.png";
    private static final int PREF_W = 400;
    private static final int PREF_H = PREF_W;
    private BufferedImage dbimage = null;
    private int imgX = 0;
    private int imgY = 0;

    public Game(BufferedImage dbimage) {
        this.dbimage = dbimage;
    }

    // draw within the paintComponent method, not the paint method
    @Override
    protected void paintComponent(Graphics g) {
        // call the super's method to all painting to chain down the line
        super.paintComponent(g);
        if (dbimage != null) {
            g.drawImage(dbimage, imgX, imgY, this);
        }
    }

    // set the preferred size of the main Game JPanel safely 
    @Override
    public Dimension getPreferredSize() {
        if (isPreferredSizeSet()) {
            return super.getPreferredSize();
        }
        return new Dimension(PREF_W, PREF_H);
    }

    private static void createAndShowGui() {
        // get your image as a resource
        URL resource = Game.class.getResource(RESOURCE_PATH);
        BufferedImage img = null;
        try {
            // read in using ImageIO
            img = ImageIO.read(resource);
        } catch (IOException e) {
            e.printStackTrace();
            System.exit(-1);
        }

        // pass image into your Game JPanel
        Game mainPanel = new Game(img);

        // pass the JPanel into a JFrame
        JFrame frame = new JFrame("Game");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);  // and display it
    }

    public static void main(String[] args) {
        // start your Swing GUI in a thread-safe manner
        SwingUtilities.invokeLater(() -> {
            createAndShowGui();
        });
    }
}

接下来查看Key Bindings以帮助您使用此GUI使用击键进行动画