嘿,所以我正在编写程序并进行调试,我正试图让程序截取部分显示的截图。我希望更新显示,但我似乎无法让它工作。我确信这是一个简单的问题,但我对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();
}
正如我所说,如果我改变小程序大小,图像会出现,并会创建新图像,但我需要不断变化的图像。
提前致谢!
答案 0 :(得分:5)
您每次通过循环创建并添加新的JLabel
。因为您要更改组件树的结构,所以需要在框架的内容窗格上调用revalidate
。
更好的解决方案是在单个JLabel上更改图像。创建一个标签,添加标签,然后在循环中使用JLabel.setIcon
和repaint
。
答案 1 :(得分:2)
正如@RD所说,如果小程序未签名,createScreenCapture()
将抛出SecurityException
。睡在事件派发线程上可能会阻止更新。当拖动鼠标时,此example捕获屏幕图像;其BufferedImage
“记住”最后拍摄的图像。
答案 2 :(得分:0)
根据我的记忆,Java中的repaint()
应该被称为invalidate()
- 它实际上并没有重新绘制窗口;它只会使它失效,所以它可以在下一个机会被操作系统重新绘制。我没有仔细查看您的代码,但我认为这可能是问题所在。我不确定如何强制重绘,但一个想法是从函数返回,然后有一个计时器中断你然后绘制它 - 这样,操作系统将有机会绘制窗口。