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