Java 由于在中执行的操作,单击Jbutton时挂起

Java 由于在中执行的操作,单击Jbutton时挂起,java,swing,awt,jbutton,repaint,Java,Swing,Awt,Jbutton,Repaint,我在一个扩展JPanel的类中有一个按钮: startTSP.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { scatterPlotPanel.findShortestPath(); } }); 我的问题是,actionListener中的方法(名为findShortestPath())必须在另一个JPan

我在一个扩展JPanel的类中有一个按钮:

startTSP.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {

             scatterPlotPanel.findShortestPath();

         }
     });
我的问题是,actionListener中的方法(名为findShortestPath())必须在另一个JPanel上不断调用repaint()。问题是,一旦我单击startTSP按钮,它就不会重新绘制或执行任何操作。它只是挂起,直到方法完成运行为止(如果给定输入,这可能需要很长时间)。它唯一重新绘制的时间是在最后。如果重要的话,我可以发布findShortestPath()的方法,但我认为这并不重要,因为我的问题是,如何让它不挂起并像在主类中调用该方法一样正常执行该方法

如果问题太模糊,我很抱歉,如果有人不明白,我会尽力解释(只是在评论中提及)


此外,基本上,该方法所做的是递归地排列坐标点的数组列表,并在点列表之间找到最短路径。这是一个简单的强力TSP解决方案。

如果在事件分派线程中执行了一个长方法,它会阻止事件分派线程,从而阻止它执行其工作:分派其他事件和绘制UI。这将有效地冻结GUI,直到long方法返回。因此,事件分派线程中不能有长的阻塞方法


使用SwingWorker在单独的线程中执行长时间运行的方法。或者,如果您想要的只是EDT上每N毫秒发生一次重复事件,那么使用
javax.swing.Timer

您可以尝试使用另一个线程在另一个面板上进行绘制。这样,您将有两个独立的线程执行不同的任务


您可以使用信号在这些线程之间进行通信。

您尝试过使用线程吗?只需使用线程来开始您的长时间使用过程。好的,我期待着这个答案,谢谢您的建议,但我对线程的使用非常差。。。我读了好几本教程,但我太迷茫了。。。你能告诉我一些简单易懂的东西吗?你能给我指一个链接来帮助我理解如何做这件事吗?javadoc用例子解释了它。Swing还有一个教程,其中有一整节专门讨论并发性: