我发现的所有其他问题似乎与“无闪烁”有关,而我实际上想要闪烁......
我正在尝试构建一个小应用程序,显示以给定频率闪烁的对象。
下面是我想要做的一个小的可行的例子。目前,我通过以给定频率执行的计划任务来闪烁对象。在此任务中,我绘制对象,等待一半时间然后删除它。这应该给我一个以给定频率闪烁的物体。
然而,我发现即使在低至4Hz的频率下,眨眼也不再稳定。我认为这是因为Java不能保证在被要求时绘制屏幕,但允许将某些绘制任务合并为一个。我不确定,但我想我读过这样的东西。
我的问题是:如何制作频率高达屏幕刷新率一半的稳定闪烁物体?
public class NewJFrame extends javax.swing.JFrame {
private final int FlashFreqHz = 4;
private java.util.Timer timer;
/**
* Creates new form NewJFrame
*/
public NewJFrame() {
initComponents();
startFlashing();
}
private class FlashingTask extends TimerTask{
@Override
public void run() {
int w=jPanel1.getWidth();
int h=jPanel1.getHeight();
try {
jPanel1.getGraphics().fillRect(10, 10, w/2, h/2);
Thread.sleep((1000/FlashFreqHz)/2);
jPanel1.getGraphics().clearRect(10, 10, w/2, h/2);
} catch(InterruptedException ex) {
ex.getStackTrace();
}
}
}
public void startFlashing() {
if(timer!=null) stopFlashing(); // running, must stop to get new position correct
timer = new java.util.Timer();
timer.scheduleAtFixedRate(new FlashingTask(), 0, 1000/FlashFreqHz); // 40 ms delay
}
public void stopFlashing() {
if (timer != null) {
timer.cancel();
timer = null;
jPanel1.repaint();
}
}
只是为了检查,这是我的'更正'代码:
import java.awt.event.ActionEvent;
import javax.swing.Timer;
import java.awt.event.ActionListener;
import javax.swing.JPanel;
import java.awt.Graphics;
public class NewJFrame extends javax.swing.JFrame implements ActionListener{
private final int FlashFreqHz = 60;
private final Timer timer;
private boolean Flash = false;
FlashFrame FlashPanel;
/**
* Creates new form NewJFrame
*/
public NewJFrame() {
initComponents();
FlashPanel = new FlashFrame();
setContentPane(FlashPanel);
timer = new Timer(1000/FlashFreqHz,this);
timer.start();
}
class FlashFrame extends JPanel {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
if(Flash) {
g.fillRect(10, 10, getWidth()/2, getHeight()/2);
} else {
g.clearRect(10, 10, getWidth()/2, getHeight()/2);
}
}
}
@Override
public void actionPerformed(ActionEvent e) {
FlashPanel.repaint();
Flash = !Flash;
}
这看起来对你有好处吗?
我开始提出的问题仍然存在。虽然频率比我的“睡眠”方法稳定得多,但仍有一些显着的不稳定性,特别是在较高的频率下。
有什么可以做的吗?