Java 摆动按钮不';不要马上反应!我怎样才能改变这一点?

Java 摆动按钮不';不要马上反应!我怎样才能改变这一点?,java,swing,Java,Swing,我用Netbeans的可视化编辑器构建了一个表单。当我按下其中一个按钮时,它应执行以下操作: 将其设置为禁用 执行一项需要一些时间的任务 任务完成后,按钮将再次启用 但是,发生了以下情况: 在任务完成之前,按钮将保持按下状态 当任务完成时,按钮的启用/禁用将非常快(它们会发生,但您不会注意到) 这种行为不是我想要的。我尝试在JButton、JFrame甚至包含按钮的JPanel上使用repaint,但我似乎无法让它做我想要的事情。一些提示?当您在按钮回调中执行操作时,实际上是在暂停gui

我用Netbeans的可视化编辑器构建了一个表单。当我按下其中一个按钮时,它应执行以下操作:

  • 将其设置为禁用
  • 执行一项需要一些时间的任务
  • 任务完成后,按钮将再次启用
但是,发生了以下情况:

  • 在任务完成之前,按钮将保持按下状态
  • 当任务完成时,按钮的启用/禁用将非常快(它们会发生,但您不会注意到)

这种行为不是我想要的。我尝试在JButton、JFrame甚至包含按钮的JPanel上使用repaint,但我似乎无法让它做我想要的事情。一些提示?

当您在按钮回调中执行操作时,实际上是在暂停gui绘制线程—不仅是为了按钮,而且是为了任何gui绘制。(尝试用另一个窗口覆盖界面,然后再次公开它-在任务完成之前,它不会重新绘制!)

您需要做的是生成一个线程来执行长时间运行的任务,然后让该线程使用SwingUtilities.invokeLater()来启用按钮。invokeLater强制在gui绘制线程中启用按钮


在长时间运行的线程运行时,您可能需要设置一个忙碌的光标或以其他方式锁定接口。

您需要在另一个线程中执行需要一些时间的任务

按钮阻塞的原因是因为工作是在绘制按钮的同一线程中完成的。一旦工作完成,按钮就可以完成你告诉它的其余部分


如果使用不同的线程,该线程将执行任务,而绘图代码可以继续绘制表单。

当您在按钮回调中工作时,您将暂停GUI绘图线程,直到它完成为止

您需要做的是生成一个线程来执行长时间运行的任务,然后让该线程使用
SwingUtilities.invokeLater()
在UI完成时更新它。不使用
invokeLater
不是线程安全的,通常是糟糕的mojo

一个基本的例子是:

button.setEnabled(false);
new Thread(new Runnable() {
 public void run() {
  // Do heavy lifting here
  SwingUtilies.invokeLater(new Runnable() {
   public void run() {
    button.setEnabled(true);
   }
  });
 }
}).start();

《太阳报》很值得一读。出色的解释和背景阅读,包括事件调度线程、使用工作线程等

具有“button.setEnabled(true)”的部分正在执行工作的线程中进行?我是否应该将按钮传递给线程(以防我不想使用匿名类)?它发生在GUI线程中。看看你有多不喜欢匿名类,这取决于你自己。你可能也想尝试一下。此外,计算新的按钮状态(在EDT中)比使用关于位置的旧状态触发延迟消息更健壮。我忘了,run方法。谢谢你,汤姆。去告诉你我是多么依赖我的IDE:)太糟糕了,我们不能合并答案。@Allain,重要的是确保被接受的答案尽可能好。