具有稳定频率的java闪烁对象

时间:2014-04-02 20:32:03

标签: java swing frequency

我发现的所有其他问题似乎与“无闪烁”有关,而我实际上想要闪烁......

我正在尝试构建一个小应用程序,显示以给定频率闪烁的对象。

下面是我想要做的一个小的可行的例子。目前,我通过以给定频率执行的计划任务来闪烁对象。在此任务中,我绘制对象,等待一半时间然后删除它。这应该给我一个以给定频率闪烁的物体。

然而,我发现即使在低至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;
}

这看起来对你有好处吗?

我开始提出的问题仍然存在。虽然频率比我的“睡眠”方法稳定得多,但仍有一些显着的不稳定性,特别是在较高的频率下。

有什么可以做的吗?

0 个答案:

没有答案