【发布时间】:2015-02-07 06:11:55
【问题描述】:
我遇到了为我的 gui 创建停止/启动 jbuttons 的问题,经过大量谷歌搜索后,我意识到我需要多线程。进一步阅读后,我发现了 swingworker 类,并且我设法让我的 GUI 响应 STOP 按钮。
现在我的问题是这样的
doinbackground() 方法执行一段代码,在无限 while 循环中捕获数据包,条件为 (!isCancelled),一旦它被取消(STOP 按钮执行 worker.cancel()),它会返回一个 ArrayList理论上,我应该能够使用 get() 在 done() 方法中获取数据包。正确的?但是当我尝试这样做时,我得到了一个 CancellationException,这让我现在发疯了。
任何帮助都将受到高度评价! 谢谢
编辑:obj 是在类外部声明的用于存储返回值的 ArrayList。
这是我通过 START jbutton 执行的代码
private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) {
final ArrayList packet_list = new ArrayList();
obj.clear();
try {
worker = new SwingWorker<ArrayList,Integer>(){//initialze swingworker class
@Override
protected void done(){
try {
obj = get();
}
catch (InterruptedException ex) {
Logger.getLogger(NewJFrame3.class.getName()).log(Level.SEVERE, null, ex);
} catch (ExecutionException ex) {
Logger.getLogger(NewJFrame3.class.getName()).log(Level.SEVERE, null, ex);
}
}
//opens up stuff required to capture the packets
NetworkInterface [] devices = JpcapCaptor.getDeviceList();
int index = (jComboBox5.getSelectedIndex()-1);
JpcapCaptor captor =JpcapCaptor.openDevice(devices[4], 65535, false, 20);
@Override
protected ArrayList doInBackground(){
while(!isCancelled()){
try {
Packet packets = captor.getPacket(); //captures packets
if (packets != null) //filters out null packets
{
//System.out.println(packets);
packet_list.add(packets); //adds each packet to ArrayList
}
Thread.sleep(100);
} catch (InterruptedException ex) {
return packet_list;
}
}
return packet_list;
}
};
worker.execute();
} catch (IOException ex) {
Logger.getLogger(NewJFrame3.class.getName()).log(Level.SEVERE, null, ex);
}
}
The stop button simply executes
worker.cancel(); no errors there. and this is the swingworker declaration
private SwingWorker<ArrayList,Integer> worker;
【问题讨论】:
标签: java multithreading user-interface swingworker