2015-01-30 7 views
0

for 루프 내부에서 각 i 째 반복 이후에 지연을 넣어야합니다. 문제는 이전 반복에 의존하는 ck 매개 변수를 사용해야하기 때문에 아마도 Timer을 사용할 수 없다는 것입니다.Thread.sleep을 사용하여 for 루프에 지연을 추가하는 방법은 무엇입니까?

나는 Thread.sleep(DELAY)을 사용하려했지만 전체 for 루프의 실행을 지연시킨다.

double c = 3; 
    int k = 1; 

    for (int j = 0; j<sumJ; j++) 
    { 
     for (int i=0; i<sumI; i++) 
     { 
      //...calculations based on values of c and k 
      // received in previous iterations 
      try { 
       Thread.sleep(100); 
      } catch(InterruptedException ie) {} 
     } 
    } 
+1

당신은하지 모든 반복에, 어떤 조건에서 Thread.sleep를 실행할 수의 크기를 바꿀 수 있다는

참고. –

+1

"전체 루프의 실행을 지연시키지 않는" "각 반복 후 지연"이란 무엇을 의미합니까? 그것이 지연되어야 할 때와해야 할 때를 설명하십시오. – RealSkeptic

+0

@RealSkeptic : 각 반복을 지연하고 싶습니다. 내가 JTable을 가지고 있고, for 루프가 테이블을 채우는 역할을한다고 상상해 보라. 한 번에 테이블을 채우는 대신 사용자가 진행 상황을 볼 수 있도록 단계별로 (한 종류의 간단한 애니메이션) 채우기를 원합니다. 그래서 각 반복 사이에 100 밀리 초라고하는 작은 지연을 추가하려고합니다. –

답변

0

좋아, 여기 타이머를 사용하는 아주 간단한 예입니다. 이것은 우리가 사용하고있는 javax.swing.Timer이며 중요한 것은 구성 요소에 대한 모든 변경을 수행해야하는 이벤트 스레드에서 작업이 완료되도록하기 때문입니다.

기본적으로 테이블을 만들고 표시 한 다음 여전히 주 스레드에 데이터를 준비합니다. 마지막으로 우리는 타이머를 시작하고 우리가 준비한 데이터의 다음 값을 채우는 0.5 초마다 액션 이벤트를 트리거합니다. 표가 작성하는 동안, 당신은 GUI를 함께 놀러 등, 셀을 선택

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JFrame; 
import javax.swing.JTable; 
import javax.swing.Timer; 

class SimpleTest implements ActionListener{ 

    public static final int ROWS = 10; 
    public static final int COLS = 10; 
    public static final int DELAY = 500; 

    private Integer[][] data = null; 
    private int currCol; 
    private int currRow; 
    private JTable tableToFill = null; 
    private Timer theTimer = null; 

    /** 
    * Calculates the data that should be displayed in the table. 
    * In this case it's a simple multiplication table. 
    */ 
    public void fillData() { 
     data = new Integer[ROWS][COLS]; 
     for (int row = 0; row < ROWS; row++) { 
      for (int col = 0; col < COLS; col++) { 
       data[row][col] = (row + 1) * (col + 1); 
      } 
     } 
    } 

    /** 
    * Creates a GUI table to fill up. 
    * @return The table object created. 
    */ 
    public JTable setUpJTable() { 
     tableToFill = new JTable(ROWS,COLS); 
     return tableToFill; 
    } 

    /** 
    * Starts the timer that fills the values in the GUI table 
    */ 
    public void startTimer() { 
     if (tableToFill != null && data != null) { 
      currCol = 0; 
      currRow = 0; 
      theTimer = new Timer(DELAY, this); 
      theTimer.start(); 
     } 
    } 

    /** 
    * Called by the timer to set the value in the table. 
    * 
    * @param evt Action event (not used) 
    */ 
    public void actionPerformed(ActionEvent evt) { 
     synchronized (this) { 
      if (currRow < ROWS) { 
       tableToFill.setValueAt(data[currRow][currCol], currRow, currCol); 
       currCol++; 
       if (currCol == COLS) { 
        currCol = 0; 
        currRow++; 
       } 

      } else { 
       theTimer.stop(); 
      } 
     } 
    } 

    public static void main(String[] args) { 

     SimpleTest tableFiller = new SimpleTest(); 
     JTable table = tableFiller.setUpJTable(); 

     // Display the table 

     JFrame frame = new JFrame("Test"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().setLayout(new BorderLayout()); 
     frame.getContentPane().add(table.getTableHeader(), BorderLayout.PAGE_START); 
     frame.getContentPane().add(table, BorderLayout.CENTER); 
     frame.pack(); 
     frame.setVisible(true); 

     // Fill the data, then start displaying it gradually 

     tableFiller.fillData(); 
     tableFiller.startTimer(); 
    } 


} 
관련 문제