2011-11-01 36 views
0

我仍然在学习Java Swing工具包及其工作原理。我正在研究如何将图像添加到我的JFrame(通过JPanel)并找到本教程(HERE)。我的问题有办法,我设置了做我的源代码:关于将BufferedImage添加到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); 
    } 

}

如果我带走初始化方法,并把try/catch语句(初始化我的形象)我的构造函数中,我的代码编译并运行,但我最终得到一个空白窗口。如果我将try/catch放在paint中,就像它在源代码中显示的一样,我的程序运行得非常好,图像加载,黑色背景以及其他一切。

TLDR; Image1是当我在构造函数中进行初始化时发生的情况,Image 2是在运行良好时发生的情况,并且在我的paint方法中进行初始化。 Take a Look

为什么我无法在构造函数中初始化图像?

+2

您描述的行为并非我在您描述的情景下期望的行为。你可以发布一个展示你描述的行为的[SSCCE](http://sscce.org)吗? –

+2

“Swing程序应该重写'paintComponent()'而不是重写'paint()'。” - [在AWT和Swing中绘制:绘制方法](http://java.sun.com/products/jfc/tsc/文章/绘画/ index.html的#回调)。 – trashgod

+0

你确定你的图像像你认为的那样从构造函数中读取时被填充了吗?查找打印到控制台的异常。你可以试着让异常从构造函数中解脱出来,因​​为e.printStacktrace()让你的程序继续工作,就好像它在真的处于不良状态时一样工作。 – chubbsondubs

回答

2

如果paint()被调用,你的构造函数会被调用。像你显示的空白屏幕意味着有一个异常被抛出你的绘画方法。尝试这个。注释掉图像绘制代码,并将图像加载代码移回到构造函数中。现在运行它。你看到黑色吗?如果你这样做,那么你知道它无一例外地在绘画。如果没有,那么你有另一个问题。检查你的控制台是否有例外如果你有黑色,取消注释图像绘制代码。你看到灰色吗?然后我打赌你的图像没有在构造函数中加载,并且paint方法抛出异常。检查你的控制台,你会看到异常,为什么它不工作。如果不在IO.read行中删除一个断点并查看您获得的值。

你也想把paint()改成paintComponent()。我认为这不会解决您的问题,但您会想要符合Swing的绘画架构。

现在,当您将paint()方法放入paint方法中时,您正在从文件系统读取数据,为它创建一个为其分配内存,绘制它并将其扔掉的新映像,并在绘制时再次执行所有操作下一帧。如果你没有意识到这会为垃圾收集器创建大量垃圾。你想在构造函数中将该图像读入内存中,然后从该内存中绘制内存。

+0

我不明白,我的控制台里根本没有任何东西出现。所以我猜测如果paint抛出一个异常没有什么捕获它,我不知道该怎么做(除非你改变Java源代码?再次idk)。 – mastrgamr

+0

我想我似乎找到了一个临时解决方案。 (http://pastebin.com/RFxQivBQ) 我可以在我的构造函数中进行初始化,并且程序运行良好,但是只有当我在try/catch中将我的调用包围到paintComponent'super'时...我真的不知道发生了什么事。 – mastrgamr

+1

你有什么搞砸了,我们看不到。你所显示的代码不是问题,但我会自己去尝试。你提到的所有解决方法都没有任何意义,所以如果混淆起来,还有其他方面的原因。您分享的代码似乎没有任何问题。我会把你的代码在我自己的程序中试一下,然后和你一起回去。有什么线程正在进行,我们应该知道吗? – chubbsondubs