如何在 JFrame 中实现 .png 图片?
How to implement .png pics in a JFrame?
你好,我想制作一个 window,一个 GUI,并在里面放一张图片。
我看了一个 YT 教程 (https://www.youtube.com/watch?v=Ap20Qw77TzY) 并复制了所有类似的东西,但我制作的 Window 根本没有图像。我尝试了不同的文件类型,如 .jpg 和不同的 window 大小,以匹配图片大小,但没有帮助。
那是我的代码,我没有得到真正的错误,除了警告:
The serializable class main does not declare a static final serialVersionUID field of type long,line 8
This method has a constructor,line 25
代码
package main;
import java.awt.Graphics;
import java.awt.Toolkit;
import javax.swing.*;
public class main extends JFrame {
/**
* author jan
*/
public main(String title){
super (title);
}
public void paint(Graphics gr) {
super.paint(gr);
gr.drawImage(Toolkit.getDefaultToolkit().getImage("Koppenhagen\Pictures\Herz.png"), 0, 0, this);
}
public static void main(String[] args) {
main window = new main("Mein Test!");
window.setSize(160,160);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setVisible(true);
}
}
- 在
Toolkit.getImage
上使用 ImageIO.read
,它会抛出 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);
}
}
}
你好,我想制作一个 window,一个 GUI,并在里面放一张图片。
我看了一个 YT 教程 (https://www.youtube.com/watch?v=Ap20Qw77TzY) 并复制了所有类似的东西,但我制作的 Window 根本没有图像。我尝试了不同的文件类型,如 .jpg 和不同的 window 大小,以匹配图片大小,但没有帮助。
那是我的代码,我没有得到真正的错误,除了警告:
The serializable class main does not declare a static final serialVersionUID field of type long,line 8
This method has a constructor,line 25
代码
package main;
import java.awt.Graphics;
import java.awt.Toolkit;
import javax.swing.*;
public class main extends JFrame {
/**
* author jan
*/
public main(String title){
super (title);
}
public void paint(Graphics gr) {
super.paint(gr);
gr.drawImage(Toolkit.getDefaultToolkit().getImage("Koppenhagen\Pictures\Herz.png"), 0, 0, this);
}
public static void main(String[] args) {
main window = new main("Mein Test!");
window.setSize(160,160);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setVisible(true);
}
}
- 在
Toolkit.getImage
上使用ImageIO.read
,它会抛出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);
}
}
}