2014-09-30 8 views
0

나는 스윙 타이머를 intervals.so에서 사용하는 간단한 응용 프로그램을 만들고 있습니다.하지만 100 밀리 초 간격으로 설정하면 문제가 발생합니다.왜 자바 스윙 타이머 자동 멈춤?

Timer t=new Timer(100, new ActionListener()//this is working 

그러나 1000으로 설정하면 작동하지 않습니다.

Timer t=new Timer(1000, new ActionListener()//this is not working 

오류없이하지만 낸것도 사용 netbeans.i이 .this을 중지 한 프로그램을 볼 수 없습니다 자동으로 terminate.timer 프로그램은 내가 콘솔에서 볼 것입니다.

enter image description here

내가 뭔가를 그리워 가지고 불러야 잘못 한 일을 내가 알아낼 수 없습니다?

은 타이머 스레드도 시작하기 전에 주 스레드가 종료되기 때문입니다 내 코드

public class Screenshot { 
    Rectangle screenRect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()); 
    private final String s; 
    int i=0; 
    public Screenshot() { 
     SimpleDateFormat sdf=new SimpleDateFormat("M,dd,hh,mm,ss"); 
     s = sdf.format(new Date()); 
     System.out.println(s); 
     shoot(); 
     System.out.println("CALLED"); 
    } 

    public final void shoot() { 

     Timer t=new Timer(1000, new ActionListener() {//not working with 1000 but work with 100 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       try { 
        i++; 
        System.out.println(i); 
        BufferedImage capture = new Robot().createScreenCapture(screenRect); 
        ImageIO.write(capture, "jpg", new File("C:\\Users\\Madhawa.se\\Desktop\\screenshot\\"+s+"sh"+i+".jpg")); 
       } catch (Exception ex) { 
        ex.printStackTrace(); 
       } 
      } 
     }); 
     t.start();   
    } 
    public static void main(String[] args) { 
     Screenshot shot=new Screenshot();  
    }  
} 

답변

3

입니다. Screenshot 클래스의 인스턴스를 만든 후 main() 메서드에 wait() 메서드를 추가해보십시오.

이렇게하면 main() 메소드가 종료되지 않습니다. 실제 응용 프로그램에서는 사용자가 프로그램을 종료 할 수있게 해주는 논리를 원할 수 있지만 이는 즉각적인 문제를 해결합니다.

여기에 무슨 뜻인지의 예 : 내가 할 것

import javax.swing.Timer; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

public class Test { 

    public Test() { 
     start(); 
    } 

    public final void start() { 

     Timer t=new Timer(1000, new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       System.out.println("Firing!"); 
      } 
     }); 
     t.start();   
    } 
    public static void main(String... args) { 
     Test shot=new Test(); 

     synchronized(shot){ 
      try { 
       //this causes the Main thread to block, keeping the program running 
       shot.wait(); 
      } 
      catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    }  
} 
+0

@getlost 정말 스레딩과 스윙 동시성에 대한 자습서를 읽어야합니다. 테스트 해보기위한 간단한 예제 프로그램을 작성할 때 어떤 일이 일어 났습니까? –

1

우선 그것이 고려 스레딩 스윙 발생하도록 코드를 다시 작성하려고하는 것입니다.

편집 : 실제로 스윙 타이머는 스윙 GUI가없는 상황에서는 사용하지 않아야합니다. 스윙 타이머는 GUI없이 스윙 스레드를 계속 유지하지 않기 때문입니다. 대신 java.util.Timer를 사용합니다.

+0

내가 스윙 timer.may 스레드가 필요하지 않는 것 같아요.하지만 왜 출구가 궁금해 궁금해. –

+0

@ getlost : 그냥 스윙 스레드를 시작 얻을 JOptionPane 보여, 당신은 코드 작동을 볼 수 있습니다. –