无法让JFrame刷新图像

时间:2011-01-03 02:02:19

标签: java image swing applet jframe

嘿,所以我正在编写程序并进行调试,我正试图让程序截取部分显示的截图。我希望更新显示,但我似乎无法让它工作。我确信这是一个简单的问题,但我对Java Applets的经验非常小。

以下是我遇到问题的部分:

...
Thread.sleep(5000);
    try {gb = new GameBoard(frame.getBounds());}
    catch(Exception e){System.out.println("Error.");} // Make "gameboard" Object

    while (true)
    {
        Thread.sleep(1000);
        gb.grabImage(); // use java.awt.Robot's createScreenCapture()

        ImageIcon icon = new ImageIcon(gb.image()); // wrap the image 
        JLabel label = new JLabel(icon, JLabel.CENTER);
        frame.getContentPane().add(label,BorderLayout.EAST); //display the image (works)
        //JOptionPane.showMessageDialog(null, label, "icon", -1);
        label.repaint(); //update the display??
        frame.repaint();
        frame.getContentPane().repaint();
    }

正如我所说,如果我改变小程序大小,图像会出现,并会创建新图像,但我需要不断变化的图像。

提前致谢!

3 个答案:

答案 0 :(得分:5)

您每次通过循环创建并添加新的JLabel。因为您要更改组件树的结构,所以需要在框架的内容窗格上调用revalidate

更好的解决方案是在单个JLabel上更改图像。创建一个标签,添加标签,然后在循环中使用JLabel.setIconrepaint

答案 1 :(得分:2)

正如@RD所说,如果小程序未签名,createScreenCapture()将抛出SecurityException。睡在事件派发线程上可能会阻止更新。当拖动鼠标时,此example捕获屏幕图像;其BufferedImage“记住”最后拍摄的图像。

答案 2 :(得分:0)

根据我的记忆,Java中的repaint()应该被称为invalidate() - 它实际上并没有重新绘制窗口;它只会使它失效,所以它可以在下一个机会被操作系统重新绘制。我没有仔细查看您的代码,但我认为这可能是问题所在。我不确定如何强制重绘,但一个想法是从函数返回,然后有一个计时器中断你然后绘制它 - 这样,操作系统将有机会绘制窗口。