我试图想象各种图形算法。我想这样做,每2秒后图表就会更新并重新绘制。我尝试过使用Thread.sleep()方法,但它只是冻结了GUI,然后用完整的算法完成了一段时间。
(我对Java很新,所以不要对代码苛刻) 有问题的守则:
else if(ae.getSource() == fordFulkersonButton){
dinicButton.setEnabled(false);
edmondsKarpButton.setEnabled(false);
gtButton.setEnabled(false);
if(checkbox.isEnabled()){
fordFulkersonButton.setEnabled(false);
while(!fordFulkerson.getIsDone()){
flowNetwork = fordFulkerson.algoFF(flowNetwork);
popupText.setVisible(true);
Integer i = new Integer(flowNetwork.getCurrentFlow());
String s = i.toString();
popupText.setText("Aktueller Fluß: "+s);
graphDrawer.setFlowNetwork(flowNetwork);
this.showFrame();
try {
Thread.sleep(2 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Integer in = new Integer(flowNetwork.getCurrentFlow());
String st = in.toString();
popupText.setText("Algorithmus is beendet mit Fluss: "+st);
}
flowNetwork = fordFulkerson.algoFF(flowNetwork);
popupText.setVisible(true);
Integer i = new Integer(flowNetwork.getCurrentFlow());
String s = i.toString();
if(fordFulkerson.getIsDone()){
popupText.setText("Algorithmuss beednet mit maximalen Fluß: "+s);
}else{
popupText.setText("Aktueller Fluß: "+s);
}
graphDrawer.setFlowNetwork(flowNetwork);
this.showFrame();
}
答案 0 :(得分:0)
在UI线程中进行大量工作会冻结UI。如果您想制作动画或复杂的作品,请使用a worker thread或Swing timer。
您不得在Swing UI代码中调用Thread.sleep()
。相反,你需要像动画师一样思考:一次显示一帧动画。某些外部源会调用您的代码来显示下一帧。外部源是Swing计时器。您的代码绘制下一帧并返回。这样,你永远不会阻止UI线程。