좋아, 여기 타이머를 사용하는 아주 간단한 예입니다. 이것은 우리가 사용하고있는 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();
}
}
당신은하지 모든 반복에, 어떤 조건에서 Thread.sleep를 실행할 수의 크기를 바꿀 수 있다는
는참고. –
"전체 루프의 실행을 지연시키지 않는" "각 반복 후 지연"이란 무엇을 의미합니까? 그것이 지연되어야 할 때와해야 할 때를 설명하십시오. – RealSkeptic
@RealSkeptic : 각 반복을 지연하고 싶습니다. 내가 JTable을 가지고 있고, for 루프가 테이블을 채우는 역할을한다고 상상해 보라. 한 번에 테이블을 채우는 대신 사용자가 진행 상황을 볼 수 있도록 단계별로 (한 종류의 간단한 애니메이션) 채우기를 원합니다. 그래서 각 반복 사이에 100 밀리 초라고하는 작은 지연을 추가하려고합니다. –