gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:49:36 24 4
gpt4 key购买 nike

这段代码有两个问题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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com