2011-07-18 18 views
2

我已经写了GUI用于操作读卡器 - 主要由一个ADD按钮带来了一个对话框FileChooser和队列所选File到CardHopper,这在视觉上显示为JList的。如何设计也响应后端事件的Java Swing模型?

现在我想为CPU(另一JFrame,在另一个线程),能够使读卡器的要求;例如读一张卡并发给我。在读卡器拥有GUI之前,它只是一个与CPU相同的线程运行的模型,所以我可以称其为readCard()方法。现在它在一个单独的线程上,似乎正确的沟通方式是消息传递。

我正要实现使用PriorityBlockingQueue的东西,从而使CPU将put队列和读卡器读取卡的命令将take并执行命令,直到我意识到读卡器线程通常会在某处内阻塞其NetBeans提供的Swing代码,等待GUI事件,并且无法看到任何事物到达我的事件队列。而且,这种“后端”请求改变数据模型 - 所以即使我莫名其妙地在模型中执行一些代码,这将是犹太到“火”通知给GUI的ListDataListeners而GUI等待GUI事件?

我希望这不是太神秘 - 我仍然试图绕过GUI和线程的机制我的怀里。

回答

4

当GUI正在等待GUI事件时,向GUI的“触发”通知ListDataListeners是否会发生?

绝对不是。

你想要做什么是执行直接操作UI的模型(或称UI功能)Swing事件线程上的所有任务。

从本质上讲,当你准备好后,将执行一些UI任务的情况下,做到这一点,如:

SwingUtilities.invokeLater(new Runnable() { 
    public void run() { 
    ... 
    } 
} 

您可以触发所有听众,做任何你想你的ListModel(或你的其他UI模型),因为它只能在Swing线程中运行。

否则,您冒着Swing试图在绘制数据时读取数据的风险,并且您正在更新数据。理想情况下,您可以在单独的线程(或SwingWorker下)中执行所有后台工作,然后当所有内容都准备就绪后,通过invokeLater推送更新。

+2

+1,'SwingUtilities'是老板。 :) – Moonbeam

+1

+1 - 执行OP的行为是Java程序中常见的(所有常见的)问题。请注意,你也可以使用SwingWorker线程类(当然取决于你的Java版本)来做同样的事情。 – aperkins

+0

值得注意SwingWorker默认从6开始包含,但SwingX为以前的Java版本提供了一个backport,所以你仍然可以使用它! – berry120