这段代码有两个问题: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;
}
}发布于 2019-01-14 06:11:51
Swing Timer不是TimerTask,相反,您只需要简单地stop Timer ...话虽如此,你的代码中有太多的东西让我感到害怕,一点也不好笑。
首先,看看How to Use Swing Timers和JavaDocs for Swing Timer。您要查找的方法是stop。要调用它,您需要一个对Timer本身的引用。
为此,一种方法是从注册到Timer的ActionListener的ActionEvent中提取Timer引用
Timer timer = (Timer)evt.getSource();由于您在Swing中,您需要停止使用TimerTask,Swing不是线程安全的,并且您不应该尝试从事件分派线程的上下文之外更新UI -查看Concurrency in Swing以了解更多详细信息。
Graphics g = JPanel1.getGraphics();这既危险又不明智。getGraphics可以返回null,充其量只是上一个绘制周期的快照。您尝试向其进行绘制的任何内容都将在下一个绘制周期中被擦除。
停下来,去阅读Performing Custom Painting和Painting in AWT and Swing,以更好地理解Swing中的绘画是如何工作的,以及你应该如何使用它。
你似乎只是在一些徒劳的尝试中将尽可能多的代码插入到你的问题中,而不是理解你可以使用的API以及你应该如何实际使用它们。你可能需要把你的问题分解成几个小块,你可以单独处理和尝试解决,一旦你理解了它们是如何工作的,就把它们放在一起形成一个更大的解决方案。
https://stackoverflow.com/questions/54173626
复制相似问题