java - 图像未在 JFrame 中显示
问题描述
我已经尝试了一个小时,但由于某种原因,我似乎无法让我的图像显示在JFrame
画布上。我用谷歌搜索了很多其他问题,但没有一个可以提供帮助。将图像输入到框架后,我需要在其上放置文本,但我可以这样做,但我似乎无法显示图像。也更新了。
import java.util.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.*;
public class Meme extends JPanel{
public BufferedImage img;
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Generate();
}
public static void Generate() {
//Creating the frame
JFrame mainframe = new JFrame("Meme");
mainframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainframe.setSize(800, 800);
mainframe.setVisible(true);
}
/**
* @param g
*/
@Override
public void paint(Graphics g) {
try {
img = ImageIO.read(new File("pic.jpg"));
g.drawImage(img, 50, 50, this);
} catch (IOException e) {
}
}
}
解决方案
呃..这个(短)单一方法有很多问题:
public void paint(Graphics g) {
try {
img = ImageIO.read(new File("pic.jpg"));
g.drawImage(img, 50, 50, this);
} catch (IOException e) {
}
}
- 覆盖任何
JComponent
(或其扩展,如JPanel
)的正确方法是paintComponent(Graphics)
. - 任何覆盖的绘制方法都应立即调用超级方法以确保绘制 BG 和边框,从而擦除任何先前绘制的元素。
- 永远不应该在paint方法中读取图像,这仅用于绘画而不是执行任何“长时间运行”的任务,例如加载图像。将该代码移动到构造函数或
Generate
方法(顺便说一句,应该是小写首字母, IEgenerate
) - 应用程序资源(例如图像 - 我猜它是应用程序的固有部分。)将在部署时成为嵌入式资源,因此明智的做法是立即开始访问它们。嵌入式资源必须通过 URL 而不是文件访问。查看信息。嵌入资源的页面,了解如何形成 URL。
} catch (IOException e) { }
上面有人说这似乎很“愚蠢”-因为确实如此。代码忽略或破坏了那些非常方便的堆栈跟踪,这可能有助于解释直接和最相关的问题。将其更改为以} catch (IOException e) { e.printStackTrace(); }
获取更多信息。
编辑
我刚刚注意到其他可能是此代码“不行”的东西。Generate
方法是唯一从方法中调用的东西main
。它绝不会创建 aMeme
并将其添加到框架中!你到底期望什么出现在画面中?
编辑 2
这是上面的代码重新设计以包含上面的建议,以及更多。它没有解决所有潜在问题或包括所有可能的优化。
这是结果:
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.*;
import javax.imageio.ImageIO;
import javax.swing.*;
public class Meme extends JPanel {
public BufferedImage img;
Meme() {
/* This next statement is purely for debugging. If the GUI is not red
inside the frame decorations, something is very wrong. */
setBackground(Color.RED);
try {
//img = ImageIO.read(new File("pic.jpg"));
img = ImageIO.read(new URL("https://i.stack.imgur.com/7bI1Y.jpg"));
generate();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new Meme();
}
public void generate() {
//Creating the frame
JFrame mainframe = new JFrame("Meme");
mainframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainframe.add(this);
mainframe.setSize(600, 500);
mainframe.setVisible(true);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(img, 50, 50, this);
}
}
推荐阅读
- html - 提交点击后如何在图像上添加复选标记
- multithreading - 如何跨线程共享盒装特征类型的堆分配向量
- javascript - 在 Amchart 实例之上添加 HTML 元素
- python - 如何在 virtualenv 的子目录中使用 pipenv 创建一个新的 virtualenv?
- security - 如何保护 REST-API?
- firebase - Firebase Admin Go SDK 仅在 Kubernetes 内运行时出现 x509 证书错误
- angular - 如何修复未在 Angular Ionic 中加载的组件
- php - 仅包含 php 和 mysql 的依赖下拉列表
- python - 结合 iloc 和 loc
- javascript - 如何在 React (GET/PUT/POST) 中将 curl 命令转换为 Axios 调用