【发布时间】:2020-08-22 16:57:31
【问题描述】:
这是我的第二个 Java 项目,我对编程完全陌生,但我已经为此工作了很长一段时间。但是代码可能是一团糟。我正在尝试在 JFrame 中重现图像,但我不知道如何解决所述问题。会不会是文件格式的问题? 当我将包文件夹和图像文件作为路径插入时,它编译时不会出现错误消息,即使它似乎没有绘制任何内容。在我更改了我的桌面(或其他任何东西)的路径后,我得到了以下异常:
Exception in thread "main" java.lang.IllegalArgumentException: input == null!
at javax.imageio.ImageIO.read(Unknown Source)
at Informatik.Timezones.main(Timezones.java:287)
显然没有找到源,这意味着它之前被正确识别。也许我在 JFrame 而不是 Label 或 Panel 上绘图,这会导致问题。
这是main方法中生成Panel并绘制图像的部分代码。
JFrame zeichnen = new JFrame();
face = new JLabel();
face.setVisible(true);
face.setSize(1000, 1000);
face.setLayout(null);
face.setLocation(0, 0);
zeichnen.add(face);
zeichnen.setVisible(true);
zeichnen.setSize(1000, 1000);
zeichnen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
zeichnen.setLocationRelativeTo(null);
zeichnen.setResizable(false);
zeichnen.setLayout(null);
try {
bildchen = ImageIO.read(Timezones.class.getClassLoader().getResourceAsStream("Info rmatik/a.jpg"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
这是我的代表:
package Informatik;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import java.awt.RenderingHints;
import javax.swing.*;
public class Test extends JPanel{
static JLabel face;
static BufferedImage bildchen;
@Override
public void paintComponent(Graphics maler) {
super.paintComponent(maler);
Graphics2D maler2 = (Graphics2D) maler;
maler2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
maler.drawImage(bildchen, 1000, 1000, null);
}
public static void main (String args []) {
JFrame zeichnen = new JFrame();
face = new JLabel();
face.setVisible(true);
face.setSize(1000, 1000);
face.setLayout(null);
face.setLocation(0, 0);
zeichnen.add(face);
zeichnen.setVisible(true);
zeichnen.setSize(1000, 1000);
try {
bildchen = ImageIO.read(Timezones.class.getClassLoader().getResourceAsStream("/Informatik/a.jpg"));
} catch (IOException e) {
//catch block
e.printStackTrace();
}
zeichnen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
zeichnen.setLocationRelativeTo(null);
zeichnen.setResizable(false);
zeichnen.setLayout(null);
}
}
这是新的工作版本:
package Informatik;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.print.DocFlavor.URL;
import javax.swing.*;
public class TestImageLoad extends JPanel {
JLabel face;
BufferedImage bildchen;
TestImageLoad() {
initUI();
}
private void initUI() {
JFrame zeichnen = new JFrame();
face = new JLabel("face");
face.setForeground(Color.RED);
zeichnen.add(this);
this.add(face);
try {
java.net.URL url = this.getClass().getResource("/Informatik/a.jpg");
System.out.println(url);
bildchen = ImageIO.read(url);
} catch (IOException e) {
e.printStackTrace();
}
zeichnen.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
zeichnen.pack();
zeichnen.setLocationRelativeTo(null);
zeichnen.setVisible(true);
}
@Override
public void paintComponent(Graphics maler) {
super.paintComponent(maler);
maler.drawImage(bildchen, 0, 0, this);
}
public static void main(String args[]) {
Runnable r = () -> {
new TestImageLoad();
};
SwingUtilities.invokeLater(r);
}
}
【问题讨论】:
-
你的覆盖看起来放错了地方,你需要覆盖你想要展示的 JFrame
-
@Marcos Vasconcelos 你到底是什么意思?我认为我不能将 Override 符号放在其他地方
-
你到底是什么意思? - 自定义绘画是通过覆盖 JPanel 的 paintComponent() 方法来完成的。然后将面板添加到框架中。此外,您正在尝试在 (1000, 1000) 处绘制图像,该图像可能超出面板的范围,因此您将看不到图像。阅读 Custom Painting 上的 Swing 教程部分。下载工作示例并自定义是绘制图像而不是显示文本。该课程的结构比您的示例更好。
-
本教程还有一个关于
How to Use Icons的部分,它将向您展示读取图像的正确方法。 -
嗯,我调查了一下,但它似乎与 bufferedImage 无关,这可能就是问题所在。而且我相信我并没有真正理解关于覆盖 JPanel 的paintComponent() 的部分。这不是我已经做过的吗?
标签: java swing jframe bufferedimage paintcomponent