我是编码新手,使用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年发布。
任何帮助将不胜感激!
答案 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直到读取图像。它也需要只读一次。