我有一个Java方法,当被调用时,它将侦听通过网络发送的任何流量,并将有关该流量的信息打印到控制台。我的程序目前在控制台中运行,但我现在正在创建一个图形用户界面,以允许用户与程序进行交互。
目前,当我运行我的程序时,它会不断地将有关网络流量的声明打印到控制台,只要它正在运行,并且我必须停止运行的唯一方法是单击“终止”按钮。 Eclipse控制台窗口。
然而,通过我正在制作的图形用户界面,我有一个“开始”按钮,用户可以点击该按钮开始收听网络上的任何流量 - 但是一旦它开始收听,我就无法允许用户通过GUI停止它。
由于总会有信息通过网络发送,我不能等到没有收到信息才能停止通话 - 我想要做的是添加一个“停止”按钮,停止调用方法(即阻止我的程序监听网络流量),但我不知道我需要用什么方法来编写/调用来阻止第一种方法的监听。
对于我的“开始”按钮,我有一个ActionListener
,它会监听按钮上的一个点击,并在听到一个类时从另一个类调用该方法。我可以创建一个“停止”按钮,但我不知道的是当ActionListener
听到点击它时停止第一个方法被调用的方法。
有人有任何建议吗?
编辑28/04/2014 @ 14:15
这是我用来创建“停止”按钮的代码:
JButton stopCaptureButton = new JButton("Stop");
panel.add(stopCaptureButton);
stopCaptureButton.setBounds(875, 350, 80, 30);
stopCaptureButton.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
EspduReceiver.stopCapture = true;
pool.shutdown();
}
});
但出于某种原因,当我点击它时绝对没有任何反应......
我用来捕获网络信息的方法称为receivePdu()
,在此方法的开头,我有条件while(true){...
,然后是用于捕获正在获取的信息的所有代码通过网络发送。
在receivePdu()
方法结束时,我有以下代码:
Boolean queryStopCapture = stopCapture;
if(queryStopCapture == true){
break;
}
变量stopCapture
是一个全局变量,与receivePdu()
方法在同一个类中定义,行public static Boolean stopCapture = false;'
正如您所看到的,当我在stopCapture
上检测到点击时,我将true
的值设置为stopCaptureButton
,最终会触发break;
我的receivePdu()
方法,但它似乎没有这样做。
任何想法为什么?或者我做错了什么?
答案 0 :(得分:0)
您需要将此任务放入ExecutorService,然后在ActionListener中调用shutdown以停止。
// this could be cachedThreadPool or whatever
ExecutorService pool = Executors.newSingleThreadExecutor();
ActionListener start = new ActionListener(){
public void actionPerformed(ActionEvent e) {
pool.execute(new Runnable(){
public void run(){
checkTraffic();
}
});
}
};
ActionListener stop = new ActionListener(){
public void actionPerformed(ActionEvent e) {
pool.shutdown();
}
};
你可以放入支票或其他任何东西,以确保只调用一次。
答案 1 :(得分:0)
您可以在检查流量的循环中反转控件:
while(true) {
checkTraffic();
Thread.sleep(1000);
}
您可以添加控件:
while(true) {
checkTraffic();
boolean shouldIStop = lookAVariableSomewhere(); //File or database
if(shouldIStop) {
break;
}
Thread.sleep(1000);
}
然后你的"停止"按钮更新此变量。
答案 2 :(得分:0)
似乎问题是我有一个无限循环,这意味着永远不会调用break;
语句。