使用Java中的paintComponent()方法显示JPEG图像

时间:2015-12-11 04:04:26

标签: java image swing

我是编码新手,使用paintComponent()显示JPEG时遇到麻烦; java中JFrame的方法。我的代码如下所示:

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

class SimpleGuiMe {
    MyDrawPanel imageex;

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

    public void go() {
        JFrame frame = new JFrame();
        imageex = new MyDrawPanel();

        frame.getContentPane().add(imageex);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 300);
        frame.setVisible(true);
    }

    class MyDrawPanel extends JPanel {

        public void paintComponent(Graphics g) {
            Image image = new ImageIcon("WOW(1).jpg").getImage();
            g.drawImage(image,3,4,this);
        }
    }
}

我不确定是否需要保存要在某个目录中显示的JPEG文件才能使用它。

此外,我还使用了一本有点过时的教科书来获取此处显示的代码。它是Java 5.0之后的版本,但仅在2005年发布。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

您的Panel类应如下所示

class MyDrawPanel extends JPanel {
    private Image image; 
    public MyDrawPanel() {
        image = new ImageIcon("C:/..path to file../marilyn monroe.jpg").getImage();
    }
    public void paintComponent(Graphics g) {

        g.drawImage(image,3,4,this);
    }
}

ImageIcon在Sun的awt API内部使用FileInputStream,它可以采用文件的绝对路径或相对路径。如果你使用绝对路径,那么没关系,它每次都会有效。

如果你想使用相对路径,那么你必须弄清楚哪个目录是调用你的代码的java进程的当前目录。

假设我们调用以下命令

C:/users/meuser>java SimpleGuiMe

然后java进程的当前目录将是C:/users/meuser

如果您将图像放在C:/users/meuser或此目录中的子目录中,那么它可以通过如下所示的相对路径访问。

//directly inside C:/users/meuser
image = new ImageIcon("marilyn monroe.jpg").getImage();

//in a sub directory like Downloads
image = new ImageIcon("Downloads/marilyn monroe.jpg").getImage();

您可以使用javax.imageio.ImageIO来读取下面的图像,而不是使用ImageIcon。

image = ImageIO.read(new File("path to file/filename.jpg"));

ImageIO和ImageIcon之间的区别在于ImageIcon有一个构造函数支持图像位置的URL参数,而ImageIO正在从File或InputStream中读取图像。

在这种情况下,相对路径概念和绝对路径概念保持不变。

注意:每当更新UI时都会调用paintComponent方法,例如调整窗口大小或绘制/重绘任何新元素。图像读取应该在此方法之外完成,因为可能需要一些时间来读取,您不希望paintComponent()方法阻止UI直到读取图像。它也需要只读一次。