在搜索了很多有關類似問題的線程的答案後,我仍然沒有找到適合我需求的解決方案。做一個循環迭代等待repaint()方法完成
基本上,我有一個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());
}
使用[定時器](https://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html )或[工作線程](https://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html)。 – Radiodef
你在哪個線程運行這個方法? – joz
請參閱編輯以回答。 –