Java 如何在JFrame中实现.png图片?
嗨,我想做一个窗口,一个图形用户界面,并把它的图像 我观看了YT教程()并复制了所有类似的内容,但我制作的窗口根本没有图像。我尝试了不同的文件类型,如.jpg和不同的窗口大小,匹配图片大小,但没有帮助 这是我的代码,我没有收到任何真正的错误,除了以下警告:Java 如何在JFrame中实现.png图片?,java,graphics,jframe,awt,Java,Graphics,Jframe,Awt,嗨,我想做一个窗口,一个图形用户界面,并把它的图像 我观看了YT教程()并复制了所有类似的内容,但我制作的窗口根本没有图像。我尝试了不同的文件类型,如.jpg和不同的窗口大小,匹配图片大小,但没有帮助 这是我的代码,我没有收到任何真正的错误,除了以下警告: The serializable class main does not declare a static final serialVersionUID field of type long,line 8 This method has a
The serializable class main does not declare a static final serialVersionUID field of type long,line 8
This method has a constructor,line 25
代码
ImageIO.read
覆盖Toolkit.getImage
,它将抛出一个IOException
,因为某些原因无法加载图像Koppenhagen\\Pictures
中查找与程序执行上下文相关的文件。您可以使用File#exists
检查文件是否确实存在于您认为它所在的位置paint
方法中加载资源,加载图像可能需要时间,绘制应该尽可能快地运行JFrame
。JFrame
包含一个JRootPane
,其中包括一个contentPane
,所有这些都可以独立于其父容器进行绘制。相反,从一个JPanel
开始,替代它的paintComponent
方法,然后将其添加到JFrame
ImageIO.read
覆盖Toolkit.getImage
,它将抛出一个IOException
,因为某些原因无法加载图像Koppenhagen\\Pictures
中查找与程序执行上下文相关的文件。您可以使用File#exists
检查文件是否确实存在于您认为它所在的位置paint
方法中加载资源,加载图像可能需要时间,绘制应该尽可能快地运行JFrame
。JFrame
包含一个JRootPane
,其中包括一个contentPane
,所有这些都可以独立于其父容器进行绘制。相反,从一个JPanel
开始,替代它的paintComponent
方法,然后将其添加到JFrame
下面是一个简单的Swing应用程序,它可以绘制图像 您必须将映像与Java代码放在同一目录中
package com.ggl.testing;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
public class DrawImage implements Runnable {
@Override
public void run() {
JFrame frame = new JFrame("Image");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JScrollPane scrollPane = new JScrollPane(new ImagePanel(getImage()));
frame.add(scrollPane);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
private Image getImage() {
try {
return ImageIO.read(getClass().getResourceAsStream(
"StockMarket.png"));
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new DrawImage());
}
public class ImagePanel extends JPanel {
private static final long serialVersionUID = -2668799915861031723L;
private Image image;
public ImagePanel(Image image) {
this.image = image;
this.setPreferredSize(new Dimension(image.getWidth(null), image
.getHeight(null)));
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 0, 0, this);
}
}
}
下面是一个简单的Swing应用程序,它可以绘制图像 您必须将映像与Java代码放在同一目录中
package com.ggl.testing;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
public class DrawImage implements Runnable {
@Override
public void run() {
JFrame frame = new JFrame("Image");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JScrollPane scrollPane = new JScrollPane(new ImagePanel(getImage()));
frame.add(scrollPane);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
private Image getImage() {
try {
return ImageIO.read(getClass().getResourceAsStream(
"StockMarket.png"));
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new DrawImage());
}
public class ImagePanel extends JPanel {
private static final long serialVersionUID = -2668799915861031723L;
private Image image;
public ImagePanel(Image image) {
this.image = image;
this.setPreferredSize(new Dimension(image.getWidth(null), image
.getHeight(null)));
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 0, 0, this);
}
}
}
您已经声明了两次
main
。另外,为什么要将名为main
的类作为JFrame
的子类?只需创建一个新项目并使用JFrame作为对象。你的代码不是面向对象的编程。@Dimitris Sfunis哦,是的,谢谢,我知道我不是面向对象的编程,但在我考虑这个问题之前,我必须了解整件事。^^你有什么建议来解决我的实际问题吗?^你试过ImageIcon吗?您已经声明了两次main
。另外,为什么要将名为main
的类作为JFrame
的子类?只需创建一个新项目并使用JFrame作为对象。你的代码不是面向对象的编程。@Dimitris Sfunis哦,是的,谢谢,我知道我不是面向对象的编程,但在我考虑这个问题之前,我必须了解整件事。^^你有什么建议来解决我的实际问题吗?^你试过ImageIcon吗?非常感谢您的回答,一旦我理解了您的提示,我会尝试按照它们进行操作。如果我们知道图像位置和代码之间的关系,那将非常有帮助,谢谢!我试过file.exists,但他找不到,所以我把它放在另一个文件夹中,并使用了我代码中的完整路径,知道它终于起作用了^^^谢谢你的帮助!!!!!如果ypu可以指定或解释我,您的第四个答案id将得到很大帮助:)注意:应用程序资源将在部署时成为嵌入式资源,因此现在就开始像访问它们一样访问它们是明智的。必须通过URL而不是文件访问。有关如何形成URL的信息,请参阅。非常感谢您的回答,一旦我理解了您的提示,我将尝试遵循这些提示。如果我们知道图像位置与您的代码之间的关系,那将非常有帮助,谢谢!我试过file.exists,但他找不到,所以我把它放在另一个文件夹中,并使用了我代码中的完整路径,知道它终于起作用了^^^谢谢你的帮助!!!!!如果ypu可以指定或解释我,您的第四个答案id将得到很大帮助:)注意:应用程序资源将在部署时成为嵌入式资源,因此现在就开始像访问它们一样访问它们是明智的。必须通过URL而不是文件访问。有关如何形成URL的信息,请参见。