0

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

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

             scatterPlotPanel.findShortestPath();

         }
     });

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

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

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

4

2 回答 2

2

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

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

于 2013-08-16T14:20:08.510 回答
0

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

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

于 2013-08-16T14:21:01.280 回答