我仍在学习Java Swing工具包及其工作原理。我正在研究如何将图像添加到JFrame(通过JPanel)的不同方法,并找到了这个教程(在这里)。我的问题与我设置源代码的方式有关:
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放到paint中,就像我的源代码中显示的那样,我的程序运行得很好,图像加载,黑色背景,等等。
TLDR; Image1是我在构造函数中初始化时发生的情况,imag2是当它运行良好并在我的paint方法中初始化时发生的情况。(Take a Look)
为什么我不能在构造函数中初始化我的图像?
如果paint()被调用,构造函数将被调用,这是保证的。你正在显示的空白屏幕意味着在你的paint方法中抛出了一个异常。试试这个。注释掉图像绘制代码,并将图像加载代码移回构造函数。现在运行它。你看到黑色了吗?如果你这样做了,那么你就知道这是毫无例外的绘画。如果不是,那你就有另一个问题了。检查控制台是否有异常。如果你有黑色,取消注释图像绘制代码。你看到灰色了吗?那么我打赌你的图像没有在构造函数中加载,而且paint方法抛出了一个异常。检查你的控制台,你会看到为什么它不工作的异常。如果没有,在IO上放置一个断点。读行,看看你得到的值。
你也要把paint()改为paintComponent()。我不认为这会解决你的问题,但是你会想要遵从Swing的绘制架构。
现在,当您将initialize()方法放入paint方法中时,您正在从文件系统中读取,创建新图像,为其分配内存,绘制它,然后丢弃它,并在绘制下一帧时再次执行所有这些操作。如果您没有意识到这一点,那么这会为垃圾收集器创建大量垃圾。您希望在构造函数中将此图像读入内存一次,并从此以后从该内存中绘制。