这是使用Bresenham算法在计算位置绘制点的代码:
public void drawBresenhamPoints(Graphics2D g2, List<Point> bresenham) throws InterruptedException
{
Graphics2D g = (Graphics2D) g2;
if(bresenham == null)
return;
g.setColor(Color.DARK_GRAY);
for(int i = 0; i < bresenham.size(); i = i+20)
{
int x = bresenham.get(i).x - pointWidth1/2;
int y = bresenham.get(i).y - pointWidth1/2;
int ovalW = pointWidth1;
int ovalH = pointWidth1;
g.fillOval(x, y, ovalW, ovalH);
// delay
try
{
Thread.sleep(10);
}
catch(Throwable e)
{
System.out.println(e.getMessage());
}
}
}
列表'bresenham'包含在Bresenham的线绘制算法的帮助下预先计算的所有点。我想在'for'循环内设置1秒的延迟,以便在1秒的间隔后绘制每个点。 “延迟”部分中列出的部分不起作用。如何让'延迟'工作? 更具体地说,我希望在屏幕上以1秒的间隔逐个显示所有点。
答案 0 :(得分:4)
我假设您在paint/paintComponent
方法中调用此方法。
只是一个指针:永远不会睡觉油漆过程
而是使用javax.swing.Timer
来执行重复任务。 我会做的是
有两个Lists
。您的List<Point> bresenham
和另一个List<Point> paintList
。 bresenham
将保留您的数据,paintList
最初将为空。
使用paintList
绘制积分
@override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
for (Point p : paintList) {
int x = bresenham.get(i).x - pointWidth1/2;
int y = bresenham.get(i).y - pointWidth1/2;
int ovalW = pointWidth1;
int ovalH = pointWidth1;
g.fillOval(x, y, ovalW, ovalH);
}
}
虽然paintList
中最初没有任何内容,但每次触发计时器事件时,您都会在列表中添加新的Point
。
Timer timer = new Timer(100, new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
if (bresenham.isEmpty()) {
((Timer)e.getSource()).stop();
} else {
paintList.add(bresemham.get(0));
bresenham.remove(0);
}
repaint();
}
});
timer.start();
构造函数的基本计时器是delay
,这是&#34;迭代&#34; 之间延迟的时间,以及实际侦听的侦听器中的第二个参数每delay
毫秒触发的计时器事件。那么上面的代码基本上做的是为从Point
列表中取出的paintList
添加bresenham
,然后移除调用repaint
的{{1}}项。当列表为空时,计时器将停止。
<强>更新强>
这是一个完整的运行示例
paintComponent
答案 1 :(得分:0)