Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么计时器()在java中会延迟?_Java_Timer - Fatal编程技术网

为什么计时器()在java中会延迟?

为什么计时器()在java中会延迟?,java,timer,Java,Timer,我用Java编写了一个时钟, 它将显示时钟包括秒, 这就是我设置计时器的方式 重新喷漆将在时钟面板上起作用。 程序将正常显示时钟, 唯一的问题是时钟上的时间比实时慢1或2秒 然后我将响应时间改为100 Timer timer = new Timer(100, new TimerListener()); 这一次与实时相比没有延迟 我只是不明白为什么。谁能给我解释一下定时器是怎么工作的,谢谢 附言。 这是我的钟码 public class Clock extends JPanel

我用Java编写了一个时钟, 它将显示时钟包括秒, 这就是我设置计时器的方式

重新喷漆将在时钟面板上起作用。 程序将正常显示时钟, 唯一的问题是时钟上的时间比实时慢1或2秒

然后我将响应时间改为100

        Timer timer = new Timer(100, new TimerListener());
这一次与实时相比没有延迟

我只是不明白为什么。谁能给我解释一下定时器是怎么工作的,谢谢

附言。 这是我的钟码

public class Clock extends JPanel {
public double hour;
public double minute;
public double second;

public Clock() {
    setFont(Common.SetFont.font);

}

@Override 
protected void paintComponent(Graphics g) {
    super.paintComponent(g);



    FontMetrics fm = g.getFontMetrics(Common.SetFont.font);

    int xCenter = getWidth() / 2;
    int yCenter = getHeight() / 2;
    int radius = (int)(Math.min(xCenter, yCenter) * 0.7);
    int radius1 = (int)(radius * 0.8);

    g.drawOval(xCenter - radius, yCenter - radius, 2 * radius, 2 * radius);

    for (int i = 1; i <= 12; i++) {
        g.drawString(i + "", (int)(xCenter + radius1 * Math.sin(i * Math.PI / 6)) - (int)(fm.stringWidth(i + "") / 2), (int)(yCenter - radius1 * Math.cos(i * Math.PI / 6)) + (int)(fm.getAscent() / 2));
    }

    Calendar calendar = new GregorianCalendar();
    hour = calendar.get(calendar.HOUR);
    minute = calendar.get(calendar.MINUTE);
    second = calendar.get(calendar.SECOND);
    // draw hour line
    g.drawLine(xCenter, yCenter, xCenter + (int)(radius1 * 2 / 5 * Math.sin(2 * Math.PI * (hour + minute / 60) / 12)), yCenter - (int)(radius1 * 2 / 5 * Math.cos(2 * Math.PI * (hour + minute / 60) / 12)));

    //draw minute line
    g.drawLine(xCenter, yCenter, xCenter + (int)(radius1 * 3 / 5 * Math.sin(2 * Math.PI * (minute + second / 60) / 60)), yCenter - (int)(radius1 * 3 / 5 * Math.cos(2 * Math.PI * (minute + second / 60) / 60)));

    //draw second line
    g.drawLine(xCenter, yCenter, xCenter + (int)(radius1 * 5 / 6 * Math.sin(2 * Math.PI * (second) / 60)), yCenter - (int)(radius1 * 5 / 6 * Math.cos(2 * Math.PI * (second) / 60)));
}

@Override 
public Dimension getPreferredSize() {
    return new Dimension(2000, 1000);
}

}

您使用的是哪个计时器?有两个计时器。你的钟看起来怎么样?这是一个与时间有关的问题吗?请发布您的代码。计时器仅保证它至少等待“n”毫秒的时间,通常稍长。当执行操作时,它用于在不断定义的时间间隔下运行代码。@Jeremy我在swing软件包中使用计时器
public class Clock extends JPanel {
public double hour;
public double minute;
public double second;

public Clock() {
    setFont(Common.SetFont.font);

}

@Override 
protected void paintComponent(Graphics g) {
    super.paintComponent(g);



    FontMetrics fm = g.getFontMetrics(Common.SetFont.font);

    int xCenter = getWidth() / 2;
    int yCenter = getHeight() / 2;
    int radius = (int)(Math.min(xCenter, yCenter) * 0.7);
    int radius1 = (int)(radius * 0.8);

    g.drawOval(xCenter - radius, yCenter - radius, 2 * radius, 2 * radius);

    for (int i = 1; i <= 12; i++) {
        g.drawString(i + "", (int)(xCenter + radius1 * Math.sin(i * Math.PI / 6)) - (int)(fm.stringWidth(i + "") / 2), (int)(yCenter - radius1 * Math.cos(i * Math.PI / 6)) + (int)(fm.getAscent() / 2));
    }

    Calendar calendar = new GregorianCalendar();
    hour = calendar.get(calendar.HOUR);
    minute = calendar.get(calendar.MINUTE);
    second = calendar.get(calendar.SECOND);
    // draw hour line
    g.drawLine(xCenter, yCenter, xCenter + (int)(radius1 * 2 / 5 * Math.sin(2 * Math.PI * (hour + minute / 60) / 12)), yCenter - (int)(radius1 * 2 / 5 * Math.cos(2 * Math.PI * (hour + minute / 60) / 12)));

    //draw minute line
    g.drawLine(xCenter, yCenter, xCenter + (int)(radius1 * 3 / 5 * Math.sin(2 * Math.PI * (minute + second / 60) / 60)), yCenter - (int)(radius1 * 3 / 5 * Math.cos(2 * Math.PI * (minute + second / 60) / 60)));

    //draw second line
    g.drawLine(xCenter, yCenter, xCenter + (int)(radius1 * 5 / 6 * Math.sin(2 * Math.PI * (second) / 60)), yCenter - (int)(radius1 * 5 / 6 * Math.cos(2 * Math.PI * (second) / 60)));
}

@Override 
public Dimension getPreferredSize() {
    return new Dimension(2000, 1000);
}
public class jClockAnimation extends JFrame {
Common.Clock clock = new Common.Clock();



public jClockAnimation() {

    Timer timer = new Timer(100, new TimerListener());

    add(clock, BorderLayout.NORTH);
    add(new MessagePanel(), BorderLayout.SOUTH);

    timer.start();
}


public static void main(String[] args) {
    new Common.SetFrame(new jClockAnimation(), "Clock");
}


class TimerListener implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {

        repaint();
    }
}

class MessagePanel extends JPanel {
    public MessagePanel() {
        setFont(Common.SetFont.font);
    }
    @Override
    protected void paintComponent(Graphics g) {

        String string = new String((int)clock.hour + ": " + (int)clock.minute + ": " + (int)clock.second);

        FontMetrics fm = g.getFontMetrics();
        g.drawString(string, getWidth() / 2 - fm.stringWidth(string) / 2, getHeight() / 2 + fm.getAscent() / 2);
    }

    @Override 
    public Dimension preferredSize() {
        return new Dimension(400, 200);
    }
}