2012-12-12 39 views
1

我添加了一个动作监听我的按钮:如何更新actionPerformed()内的JFrame?

myButton.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) 
    { 
     myButtonAction(); 
    } 
}); 

该按钮将启动阻塞/卖出看涨。我想在调用发生之前更新JFrame(一些组件) - 通知用户。但是,对于JFrame,似乎没有立即着色。我应该怎么做?

此时任何变化,包括myButton.setEnabled(false)都不会得到更新,直到​​完成。

我应该真的只是创建新的线程(非与用户界面相关)吗?这对我来说似乎是一个轻量级的任务。

+0

无论你的任务是快速/快速/轻量级和其他线程是不必要的,要么它不够快,你应该将其移动到另一个线程。请记住,您绝对不应该在EDT(Event Dispatching Thread)之外修改UI。 SwingUtilities.invokeLater/invokeAndWait可以为SwingWorker提供帮助。 –

+0

我想我应该使用一个线程 - 我只是新手知道SwingWorkers,所以应该不断创建和销毁线程。我想添加一个问题,但按钮的actionPerformed在EDT上调用是不是? – christopher

+0

是的,当然是:'ActionEvent'是一个'Event'并且像事件派发线程中的所有其他事件一样被调度。 –

回答

1

是的,你应该在另一个线程上运行它。首先,我不认为它是“轻量级”的。

如果需要,可以重新使用线程,请参见SwingWorkerThreadPoolExecutor

+0

这是答案,加强了我最初的想法。但!为什么你不认为它是轻量级的?假设我有一项任务需要几秒钟的时间。我希望能够在此期间禁用按钮。为此创造一个工人真的值得吗? – christopher

+0

不保证立即返回的所有内容都太慢。即使它不是当你测试它。如果你的程序在后台执行任务 - 虚拟机暂停执行GC - 操作系统在后台执行任务 - 你在一台较慢的机器上运行? – ignis

+0

感谢ignis。你已通知。公认 – christopher