2014-04-28 4 views
-2

나는 호출 될 때 네트워크를 통해 전송되는 모든 트래픽을 수신하고 해당 트래픽에 대한 정보를 콘솔에 출력하는 Java 메소드를 사용합니다. 내 프로그램은 현재 콘솔에서 실행되지만 사용자가 프로그램과 상호 작용할 수 있도록 그래픽 사용자 인터페이스를 만드는 방법을 모색 중입니다.자바 - 호출되는 메소드를 중지하려면 어떻게해야합니까?

현재 내 프로그램을 실행할 때 콘솔이 실행되는 동안 네트워크 트래픽에 대한 명령문이 지속적으로 인쇄되며 실행을 중지해야하는 유일한 방법은 다음과 같은 '종료'버튼을 클릭하는 것입니다. Eclipse 콘솔 창.

그러나 그래픽 사용자 인터페이스를 사용하면 사용자가 네트워크에서 트래픽을 수신하기 위해 클릭 할 수있는 '시작'버튼이 있습니다.하지만 일단 수신을 시작하면 나는 아무 것도 할 수 없습니다. 사용자가 GUI를 통해 중지 할 수 있습니다.

네트워크를 통해 정보가 전송되기 때문에 전화를 끊기위한 정보가 수신되지 않을 때까지 기다릴 수 없습니다. 전화를 끊을 '중지'버튼을 추가하는 것이 좋습니다. 방법 (즉, 내 프로그램이 네트워크 트래픽을 수신하는 것을 막을 수는 있지만) 첫 번째 방법을 듣지 못하게하려면 어떤 메소드를 작성/호출해야하는지 모르겠다.

내 '시작'버튼의 경우 버튼을 클릭하는 것을 듣고 다른 클래스의 메서드를 듣는 경우 ActionListener이 있습니다. 내가 '중지'버튼을 만들 수 있지만, 내가 무엇을 해야할지 모르겠어요. ActionListener이 클릭을 듣고 첫 번째 메소드가 호출되는 것을 막을 때 호출 할 메소드입니다.

누구든지 의견이 있으십니까? 14시 15분

이 @

편집 28/04/2014 내가 '정지'버튼을 만드는 데 사용하고있는 코드입니다 :

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(); 
    } 
}); 

을하지만 어떤 이유로, 절대적으로 아무것도 내가 그것을 클릭하면 발생합니다 ...

이 메서드의 시작 부분에 나는이 메서드를 시작할 때 while(true){..., 그 다음에 th가 있습니다. 네트워크를 통해 전송되는 정보를 캡처하는 전자 코드. receivePdu() 방법의 끝에

는 다음 코드 가지고

Boolean queryStopCapture = stopCapture; 
if(queryStopCapture == true){ 
    break; 
} 

가변 stopCapture은 라인과 receivePdu() 방법과 동일 클래스에 정의 된 전역 변수이다 public static Boolean stopCapture = false;'

볼 수 있듯이 stopCaptureButton에서 클릭이 감지되면 stopCapture의 값을 true으로 설정하고 receivePdu() 끝 부분에서 break;을 트리거해야합니다. 방법,하지만 그렇게하지 않는 것 같습니다.

왜 그런가? 아니면 내가 뭘 잘못하고있는거야?

+0

시도한 코드를 보여주기 위해 편집 된 질문입니다. – someone2088

답변

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(); 
    } 
}; 

수표를 넣거나 실행이 한 번만 호출되도록 설정할 수 있습니다.

+0

안녕하세요, 답변 해 주셔서 감사합니다. 내가 제안한 코드를 제공하려고 시도했지만 캡처가 실행되는 동안 윈도우의 버튼을 클릭 할 수는 있지만 '중지'버튼은 아무런 효과가 없습니다 ... 전화를 추가해야합니까? 그것에 또 다른 기능? – someone2088

0

당신은 트래픽을 검사하는 루프 제어를 반전 할 수 있습니다

while(true) { 
    checkTraffic(); 
    Thread.sleep(1000); 
} 

당신은 컨트롤을 추가 할 수 있습니다

while(true) { 
    checkTraffic(); 
    boolean shouldIStop = lookAVariableSomewhere(); //File or database 
    if(shouldIStop) { 
    break; 
    } 
    Thread.sleep(1000); 
} 

이 그런 다음이 변수를 "중지"버튼 업데이트됩니다.

+0

안녕하세요, 답장을 보내 주셔서 감사합니다. 제가하고 싶은 일인 것처럼 보입니다. 시도해 보았습니다 만 문제가 있습니다. Gui.java 클래스에서 '실행'을 클릭하면 문제가 발생합니다. , 캡처를 시작하기 위해 '시작'버튼 (이전에 콘솔에 캡처 된 트래픽이 표시됨)을 클릭하면 윈도우가 열립니다. 그런 다음 창에있는 다른 버튼을 클릭 할 수 없습니다. Stop-'shouldIStop' 변수의 값을 true로 설정하거나 종료합니다. 창이 응답하지 않게되고, 콘솔의 'terminate'버튼을 사용하여 메소드 호출을 멈추어야합니다. – someone2088

+0

'shouldIStop' 변수를'true' 대신 while 루프의 시작 부분에 괄호 안에 넣어야합니까? 나는. 'while (shouldIStop == true) {...' – someone2088

+0

글쎄, 내 마지막 아이디어가 작동하지 않는다. 만약 내가 그렇게하면, 내 코드를 실행한다. 어떤 이유로 Windows 전체가 충돌한다. – someone2088

0

break; 문이 호출되지 않았 음을 의미하는 무한 루프가 문제였던 것 같습니다.

관련 문제