我正在尝试创建一个读取屏幕并将其显示在框架中的线程,此代码旨在以 5fps 的速度运行,到目前为止它读取屏幕,但我无法让 JFrame 每次都显示更新图像“帧”或 200 毫秒。当我使用 repaint();或重新验证();
public static void startScreenRecorder()
{
Thread screenThread = new Thread()
{
public synchronized void run()
{
long time;
long lastFrameTime = 0;
JFrame frame = new JFrame("Screen capture");
ImagePanel panel = new ImagePanel(captureScreen());
frame.add(panel);
frame.setSize(300, 400);
frame.setVisible(true);
while (true)
{
time = System.currentTimeMillis();
while (time - lastFrameTime < 190)
{
try {
Thread.sleep(10);
} catch (Exception e) {
}
time = System.currentTimeMillis();
}
lastFrameTime = time;
panel = new ImagePanel(captureScreen());
panel.revalidate();
panel.repaint();
frame.revalidate();
frame.repaint();
}
}
};
screenThread.start();
}
最佳答案
不要使用 Thread.sleep() 来尝试控制动画。
动画应该使用 Swing Timer 来完成.当您使用计时器时,GUI 会在 EDT 上自动更新。
panel = new ImagePanel(captureScreen());
上面的代码没有做任何事情。它只是在内存中创建一个面板。实际上,您无处可将面板添加到 GUI。更改变量的引用不会更新 GUI。
相反,您可能应该将 JLabel 添加到框架中(当您最初创建框架时)。然后当你有一个新的图像时,你就可以这样做:
label.setIcon( new ImageIcon( your screen capture ) );
关于java - 我无法以 200 的间隔进行图像更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16097068/