处理前的Java Swing更新

处理前的Java Swing更新,java,swing,Java,Swing,我有一个小应用程序,目前由一个带有“打开文件”按钮的JPanel组成。 用户单击按钮后,将创建一个新的JFileChooser,以便用户可以选择一个文件 用户选择文件后,将处理此文件 我想做的是,在处理文件时,将JPanel上的文本设置为“Processing File” 我有这方面的所有代码,然后在代码之后,我调用该方法来实际处理该文件,但所发生的是,它首先处理该文件,然后更新gui组件 如何解决这个问题?正如您所指出的,处理该文件意味着Swing线程(调用它)正在等待处理完成。因此,您需要在

我有一个小应用程序,目前由一个带有“打开文件”按钮的JPanel组成。 用户单击按钮后,将创建一个新的JFileChooser,以便用户可以选择一个文件

用户选择文件后,将处理此文件

我想做的是,在处理文件时,将JPanel上的文本设置为“Processing File”

我有这方面的所有代码,然后在代码之后,我调用该方法来实际处理该文件,但所发生的是,它首先处理该文件,然后更新gui组件


如何解决这个问题?

正如您所指出的,处理该文件意味着Swing线程(调用它)正在等待处理完成。因此,您需要在单独的线程中调用它


处理应该与其他东西(包括GUI更新)并行运行。一旦完成,它可以回调另一个组件,以发出GUI可以更新状态消息的信号(请参阅并创建相应的Runnable以执行此操作)

您应该在单独的线程中处理该文件。这将使你一箭双雕:首先,你的应用程序将更加灵敏。第二,头衔的改变将会发生

OTOH,处理多线程有点棘手。特别是,您可能希望在处理线程运行时阻止某些操作,然后需要在完成后回滚


请记住,新线程不能直接执行GUI操作:非GUI线程必须使用SwingUtilities.invokeLater()来请求GUI线程代表其执行操作。

您应该在另一个线程中而不是在事件调度线程(EDT)中处理任务


您也可以使用Swing应用程序框架中的任务。您能否澄清您的“回滚”语句?回滚:您可能希望在处理过程中禁用“打开文件”菜单项。所以在你启动你的线程之前就要这么做。处理完成后,需要重新启用该菜单项。恢复原始标题也是一种回滚操作。
public void actionPerformed(ActionEvent e) { 
  statusLabel.setText("Processing File");

  new Thread(new Runnable() { 
    public void run() { 
      // do something long task
      SwingUtilities.invokeLater(new Runnable() { 
        public void run() { 
          statusLabel.setText("Done!");
        }
      });
    }
  }).start();
}