java - Jbutton 在单击时由于执行的操作而挂起

标签 java swing awt jbutton repaint

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

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

             scatterPlotPanel.findShortestPath();

         }
     });

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

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

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

最佳答案

如果在事件分派(dispatch)线程中执行一个长方法,它会阻塞事件分派(dispatch)线程,从而阻止它完成其工作:分派(dispatch)其他事件和绘制 UI。这有效地卡住了 GUI,直到长方法返回。因此,事件调度线程中一定不能有长的、阻塞的方法。

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

关于java - Jbutton 在单击时由于执行的操作而挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18275444/

相关文章:

java awt 或 Swing 组件丢失或未显示

java - 将新组件添加到在另一个类中创建的 JPanel

java - 如何停止创建单例实例

java - 如何在 SAML 响应中使用 X509 证书作为公钥

java - Servlet JDBC 也插入旧值

java - 从 SQL Server 成功检索数据后 JTable 为空

java - 为什么 Swing JButton 会截断?

java - Intellij IDEA Ultimate android 布局预览无法等待构建完成

java - 如何添加计时器来更改 java 中 JTextPane 的文本?

java - JButton 在点击几次后停止工作,没有任何其他改变