【发布时间】:2015-07-02 03:52:08
【问题描述】:
在搜索了很多类似问题的答案后,我仍然没有找到适合我需求的解决方案。
基本上,我有一个 while 循环,我想在该循环的另一次迭代开始之前等待 repaint() 方法完成。
更详细地说,我在扩展JComponent 的MapPanel 类的paintComponent 方法中绘制了一些片段。 然后,当用户单击按钮时,算法开始搜索从“上部”段开始的交叉点(使用端点作为事件点)。 这个算法基本上就是我所说的while循环,它在这个while循环中调用另一种算法,在每次迭代时发送一个事件点(这些事件点是按顺序发送的,从上到下)。
我想做的是通过在当前事件点画一条线来显示算法的当前“位置”。 当算法找到新的交叉点时,我也想展示它们。 我确实绘制了 paintComponent() 方法中需要的东西。
问题是,当我在循环内调用 MapPanel 的 repaint() 方法时,它会等待整个循环结束,然后再更新 UI(我发现了很多关于它为什么这样做但不是关于如何在我的特定情况下解决此问题)。
好的,我已经完成了解释,这是实际的算法:
private void findIntersection(ArrayList<Segment> segments){
QTree Q=new QTree();
for (Segment s : segments){
Q.initialise(s);
}
TreeT T=new TreeT();
while (Q.getRoot()!=null){
Point p = Q.maxEventPoint(Q.getRoot());
Q.delete(p.getX(), p.getY());
mapPanel.setSweeplinePosition(p.getY());
handleEventPoint(p, T, Q);
mapPanel.repaint()
//should wait here for repaint() to complete
}
System.out.println("all intersections found, found " + mapPanel.getIntersections().size());
}
【问题讨论】:
-
使用timer 或worker thread。
-
你在哪个线程运行这个方法?
-
请查看编辑以回答。
标签: java swing awt paintcomponent repaint