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

时间:2013-08-16 14:16:22

标签: java swing awt jbutton repaint

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

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

             scatterPlotPanel.findShortestPath();

         }
     });

我的问题是,actionListener中的方法(名称为findShortestPath())是一个必须不断调用另一个JPanel上的repaint()的方法。问题是,一旦我点击按钮startTSP,它就不会重绘或任何东西。它只是挂起,直到方法完成运行(给定输入可能需要很长时间)。它重新粉刷的唯一一次就在最后。如果它很重要,我可以发布findShortestPath()的方法,但我认为它不重要,因为我的问题是,如何让它不挂起,只是正常执行方法,就好像方法是在主班叫?

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

此外,该方法基本上是通过递归地通过坐标点的arraylist进行置换,并找到点列表之间的最短路径。这是一个简单的强力TSP解决方案。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

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