gpt4 book ai didi

java - 在Java中使用paintComponent()方法显示JPEG图像

转载 作者:行者123 更新时间:2023-11-30 07:43:55 24 4
gpt4 key购买 nike

我是编码新手,在使用 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 年发布。

任何帮助将不胜感激!

最佳答案

您的面板类应该如下所示

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();

您可以使用 <a href="https://docs.oracle.com/javase/7/docs/api/javax/imageio/ImageIO.html" rel="noreferrer noopener nofollow">javax.imageio.ImageIO</a> 而不是使用 ImageIcon阅读如下图像。

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

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

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

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

关于java - 在Java中使用paintComponent()方法显示JPEG图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34215933/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com