首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在执行完一次后停止定时器任务

如何在执行完一次后停止定时器任务
EN

Stack Overflow用户
提问于 2019-01-14 06:02:42
回答 1查看 452关注 0票数 1

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

代码语言:javascript
复制
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;
        }


            }
EN

回答 1

Stack Overflow用户

发布于 2019-01-14 06:11:51

Swing Timer不是TimerTask,相反,您只需要简单地stop Timer ...话虽如此,你的代码中有太多的东西让我感到害怕,一点也不好笑。

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

为此,一种方法是从注册到TimerActionListenerActionEvent中提取Timer引用

代码语言:javascript
复制
Timer timer = (Timer)evt.getSource();

由于您在Swing中,您需要停止使用TimerTask,Swing不是线程安全的,并且您不应该尝试从事件分派线程的上下文之外更新UI -查看Concurrency in Swing以了解更多详细信息。

代码语言:javascript
复制
Graphics g = JPanel1.getGraphics();

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54173626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档