statCl.addActionListener(new ActionListener(){
public void actionPerformed (ActionEvent e) {
try {
ta.append("Searching...\n");
//Do Some stuff, call some classes etc
ta.append("Search Complete\n");
} catch (Exception IOE) {}
}
});
这可能看起来像一个奇怪的问题,但我的GUI存在一些问题。基本上,我想要它,所以你点击JMenu,找到你想要的项目,点击它,它运行上面的代码。
然而,当你点击按钮时,它会在运行actionListener等内部的进程时冻结。然后最终继续,关闭菜单并让用户继续。问题是,它有点像程序崩溃了。
理想情况下,我喜欢它,以便用户点击,出现“搜索...”文本,流程运行,然后一旦完成流程,就打印出“搜索完成”
我已尝试将内容移入和移出try / catch,我尝试为同一项添加单独的actionListener但没有运气
任何想法都会非常感激。
答案 0 :(得分:3)
您需要使用SwingWorker。
用户界面的所有更新必须在事件调度线程(EDT)上进行。动作监听器中的代码也会在EDT上调用。这意味着在您的代码运行时,UI将不会更新。
处理此问题的常用方法是让长时间运行的代码在SwingWorker中运行。然后可以使用SwingUtilities.invokeLater让您的长时间运行的代码调用方法来更新UI,这必须在EDT上进行。
答案 1 :(得分:2)
尝试使用SwingWorker。