我还在学习Java Swing工具包及其工作原理。我正在研究如何将图像添加到我的JFrame(通过JPanel)的不同方法,并找到了本教程(HERE)。我的问题与我设置源代码的方式有关:
public class GraphicsPracticeDrawing extends JPanel{
private BufferedImage img;
public GraphicsPracticeDrawing() {
this.setBackground(Color.BLACK);
//Initialize(); //Program runs with no error/warning, but nothing appears in frame
}
//method initialized the BufferedImage
public void Initialize() {
try {
img = ImageIO.read(new File("images/star.jpg"));
} catch (IOException e) {
e.printStackTrace();
}
}
public void paint(Graphics g) {
super.paint(g);
Initialize(); //initialize the BufferedImage
g.drawImage(img, 25, 25, null);
}
}
如果我要删除Initialize方法并在我的构造函数中放置try / catch(初始化我的图像),我的代码会编译并运行但最后会出现一个空白窗口。如果我把try / catch放在画中,就像它在我的源代码中显示的那样,我的程序运行得非常好,图像加载,黑色背景和所有内容。
TLDR; Image1是我在构造函数中初始化时发生的事情,图2是运行正常并在我的paint方法中初始化时发生的情况。的(Take a Look)
为什么我不能在构造函数中初始化我的图像?
答案 0 :(得分:2)
如果调用paint(),则会调用构造函数。像你一样显示的空白屏幕意味着你的绘画方法会抛出异常。试试这个。注释掉图像绘制代码,并将图像加载代码移回构造函数。现在运行它。你看到黑色吗?如果你这样做,那你就知道它的绘画毫无例外。如果没有,那么你有另一个问题。检查控制台是否有异常。如果你有黑色取消注释图像绘制代码。你看到灰色吗?然后我打赌你的图像没有在构造函数中加载,并且paint方法抛出异常。检查你的控制台,你会看到它无法正常工作的例外情况。如果没有在IO.read行上删除断点并查看你得到的值。
您还希望将paint()更改为paintComponent()。我不认为这会解决你的问题,但你会想要符合Swing的绘画架构。
现在,当你在paint方法中放入initialize()方法时,你正在从文件系统中读取,创建一个新的图像为它分配内存,绘制它并扔掉它,并在我们绘制时再次执行所有这些操作。下一帧。如果您不知道它为垃圾收集器创建了大量垃圾。您希望在构造函数中将此图像读入内存一次,然后从该内存中绘制。