java - 定时器任务执行一次后如何停止

标签 java timer timertask

这段代码有两个问题 1)我在 while 语句内的代码中看到错误“从内部类引用的局部变量必须是最终的或有效的最终”。 2)虽然我使用了timer.cancel(),但我无法停止计时器。它继续工作。简而言之,每当我创建另一个对象(椭圆形)时,它都会转到前一个端点。

private void JButton3ActionPerformed(java.awt.event.ActionEvent evt) 
    {                                         
        Timer timer = new Timer(); 

        Graphics g = JPanel1.getGraphics();
        int x1 = P.objectXCoordinate + P.OvalWidth/2;
        int y1 = P.objectYCoordinate + P.OvalHeight/2;
        int x2 = P.endPointX;
        int y2 = P.endPointY;
        int dx = Math.abs(x2 - x1);
        int dy = Math.abs(y2 - y1);
        int xn = x1;
        int yn = y1;
        //Special step variables
        int xs;
        int ys;
        int pn;
        // Dicreasing xn/yn solution
        if (x2 < x1){
            xs = -1;
        }
        else{
            xs = 1;
        }
        if (y2 < y1){
            ys = -1;
        }
        else{
            ys = 1;
        }
        //Bresenham algorithm (main)
        //dx > dy
        DrawObject();
        if (dx >= dy)
        {
            pn = 2*dy - dx;
             TimerTask task = new TimerTask()
    {
        public void run()
        {
            while(xn != x2)
            {
                xn = xn + xs;
                if (pn>0)
                {
                    yn = yn + ys;
                    pn = pn + 2*dy-2*dx;
                }
                else
                {
                    pn = pn + 2*dy;
                }
                g.setColor(Color.black);
                P.objectXCoordinate = xn;
                P.objectYCoordinate = yn;
                DrawPanel();
                DrawObject();
//            g.drawLine(xn, yn, xn, yn);
            }
        }
    };
             timer.scheduleAtFixedRate(task, 0, 5000);
             task.cancel();
             task=null;

        }    
        //dy > dx
        else if (dy >=dx)
        {
            pn = 2*dx - dy;
            TimerTask task = new TimerTask()
         {
                   public void run()
           {
            while(yn != y2)
                {
                yn = yn + ys;
                if (pn>0)
                {
                    xn = xn + xs;
                    pn = pn + 2*dx-2*dy;
                }
                else
                {
                    pn = pn + 2*dx;
                }
                g.setColor(Color.black);
                P.objectXCoordinate = xn;
                P.objectYCoordinate = yn;
                DrawPanel();
                DrawObject();
//            g.drawLine(xn, yn, xn, yn);

        }

                }
         };
            timer.scheduleAtFixedRate(task, 0, 5000);
           task.cancel();
           task=null;
        }


            }

最佳答案

Swing Timer 不是 TimerTask,相反,您只需停止 Timer ...话虽如此,你的代码中有很多东西让我害怕,这并不有趣。

首先,看一下How to Use Swing TimersJavaDocs for Swing Timer 。您正在寻找的方法是 stop 。要调用它,您需要对 Timer 本身的引用。

实现此目的的一种方法是从注册到 Timer< 的 ActionListenerActionEvent 中提取 Timer 引用。/

Timer timer = (Timer)evt.getSource();

自从您使用 Swing 以来,您需要停止使用 TimerTask,Swing 不是线程安全的,您不应该尝试从事件调度线程的上下文之外更新 UI - 看看在Concurrency in Swing了解更多详情。

Graphics g = JPanel1.getGraphics();

这既危险又不明智。 getGraphics 可以返回 null,最多只是最后一个绘制周期的快照。您尝试在其上绘制的任何内容都将在下一个绘制周期中被删除。

停下来,去读一下 Performing Custom PaintingPainting in AWT and Swing更好地了解 Swing 中绘画的工作原理以及应该如何使用它。

您似乎只是在徒劳地尝试解决问题时将尽可能多的代码插入到您的问题中,而不是了解您可用的 API 以及您应该如何实际使用它们。您可能需要将问题分解成小块,您可以尝试单独解决这些小块,一旦您了解了它们的工作原理,就可以将它们组合成一个更大的解决方案

关于java - 定时器任务执行一次后如何停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54173626/

相关文章:

java - Atmosphere 与安卓

java - Gradle 构建在不同项目上总是失败

android - 我想在 Lua 中用计时器计算分数

python - 如何在单独运行的进程中修改类变量?

java - TimerTask 生成错误而不执行

Java 四舍五入 double 截断零

Java:公历日期验证问题

python - Threading.Times 不起作用

java - Repaint 方法编译不正确

java - 如果时钟改变,Timertask.scheduleAtFixedRate 应该做什么?