gpt4 book ai didi

java - JFrame 闪光图像 1/100 秒

转载 作者:行者123 更新时间:2023-12-02 05:04:38 25 4
gpt4 key购买 nike

我有 JFrame,需要使图像闪烁 10 毫秒(或显示器可以支持的最小值)。

目前,这就是我所做的:

我有一个 JFrame 和一个 JPanel 并被覆盖 paintComponent()方法。当我需要刷新该图像时,我调用 repaint()方法在 JFrame 上绘制图像,然后安排 next 调用 repaint() 10 毫秒后再次删除图像。然而,它会产生长时间的闪光,肉眼非常明显。

这是我的代码:

public static boolean show = true;

public static void main(String[] args) {
final JFrame f = new JFrame("Test");
f.setUndecorated(true);
f.setAlwaysOnTop(true);
f.setFocusable(false);
JPanel c = new JPanel() {

@Override
public void paintComponent(Graphics g) {
if (show) {
try {
// I was too lazy to save the image as a variable ;)
g.drawImage(ImageIO.read(ClassLoader.getSystemResource("Puppy.png")), 1, 1, null);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
super.paintComponent(g);
}
};
c.setOpaque(false);
c.setPreferredSize(new Dimension(1920, 1080));
f.getContentPane().add(c);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.pack();
f.setVisible(true);
com.sun.awt.AWTUtilities.setWindowOpaque(f, false);

Timer timer = new Timer();
timer.schedule(new TimerTask() {

@Override
public void run() {
long time = System.nanoTime();
show = true;
f.repaint();
timer.schedule(new TimerTask() {

@Override
public void run() {
show = false;
f.repaint();
System.out.println(System.nanoTime() - time + Boolean.toString(show));
}
}, 10);
}
}, 1000, 1000);
}

问题:为什么帧闪烁了这么长时间,而不是 10 毫秒?

最佳答案

可能会发生很多事情......

  • 调用 setVisible 之间的时间和框架对用户实际可见的时间...
  • 设置事件调度线程的时间...
  • 设置Timer并安排TimerTask的时间
  • 请求重新绘制帧与实际发生重新绘制之间的时间
  • 您请求重新绘制框架而不是实际显示图像的组件
  • 系统上的一些其他 Activity ,包括 Java API 和/或操作系统......

您需要尝试减轻其中一些问题......

因此,可以使用 WindowListener,而不是在调用 setVisible 之后直接调度 TimerTask,这样您就可以在窗口打开时收到通知打开并启动计时器然后...

不要在调用 main 的线程中构建所有内容,而是确保在事件调度线程的上下文中创建和更新 UI

不要在框架上调用repaint,而是尝试重新绘制您想要重新绘制的实际组件...

不要使用 java.util.Timer,而是使用 javax.swing.Timer,在修改 UI 状态时更安全

以下示例仅使用 JLabel 来呈现图像,并在 javax.swing.Timer 计时后将其删除...

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

/**
*
* @author shane
*/
public class Test {

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
new Test();
}

public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}

try {
BufferedImage img = ImageIO.read(new File("C:\\hold\\thumbnails\\_MTCGAC__Pulling_Cords_by_Dispozition.png"));
JLabel label = new JLabel(new ImageIcon(img));

JFrame frame = new JFrame("Testing");
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowOpened(WindowEvent e) {
Timer timer = new Timer(10, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
frame.remove(label);
frame.revalidate();
frame.repaint();
}
});
timer.setRepeats(false);
timer.start();
}
});
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(label);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
} catch (IOException exp) {
exp.printStackTrace();
}
}
});
}

}

关于java - JFrame 闪光图像 1/100 秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27893524/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com