타이머에 대한 질문드려요
살랑살랑
목표는 테트리스인데요. 한게임 들어가서 게임구성을 보니까 스톱워치처럼 타이머가 있더라구요
부분적으로 구현을 해서 응용하려고 합니다.
현재 스톱워치에 라벨(시간을 00:00:00으로 표시될 것이며 초기화 함), 버튼(시작, 멈춤, 리셋)으로
틀을 구현하였습니다.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
class boo extends jframe implements actionlistener{
static jlabel la; //입력한 숫자 표시 레이블
//jtextarea ta; //볼카운트 기록 보여주는 텍스트 에어리어
jbutton[] buttons= new jbutton[3];
container con;
jpanel pan01;//label 컴포넌트
jpanel pan02;//button 컴포넌트 컨테이너에 추가
jframe fr;
thread th;
formatter format;
public boo(){
super(count);
calendar cal = calendar.getinstance();
int hour = cal.get(calendar.hour);
int min = cal.get(calendar.millisecond);
int sec = cal.get(calendar.second);
fr = new jframe();
buttons[0] = new jbutton(start);
buttons[1] = new jbutton(stop);
buttons[2] = new jbutton(reset);
fr = new jframe();
//con = fr.getcontentpane();
pan01 = new jpanel();
pan02 = new jpanel();
pan01.setbackground(color.white);
pan02.setbackground(color.gray);
add(borderlayout.center,pan01);
add(borderlayout.south, pan02);
la = new jlabel(00:00:00);
la.setfont(new font(courier new, font.bold, 20));
pan01.add(la);
pan02.add(buttons[0]);
pan02.add(buttons[1]);
pan02.add(buttons[2]);
buttons[0].setfont(new font(courier new, font.bold, 15));
buttons[1].setfont(new font(courier new, font.bold, 15));
buttons[2].setfont(new font(courier new, font.bold, 15));
buttons[0].addactionlistener(this);
buttbsp;buttons[1].addactionlistener(this);
buttons[2].addactionlistener(this);
settitle(퐁퐁퐁);
setsize(300,100);
setvisible(true);
}
public void actionperformed(actionevent e){
string eventname = e.getactioncommand();
if(eventname.equals(start)){
buttons[0].setenabled(false);
buttons[1].setenabled(true);
buttons[2].setenabled(false);
if(th != null){
th.start();
}
//la.settext(string.format(%2d:%2d:%2d));
//la.settext(%2d:%2d:%2d, hour, min, sec);
}
else if(eventname.equals(stop)){
buttons[0].setenabled(true);
buttons[1].setenabled(false);
buttons[2].setenabled(true);
if(th == null){
th = null;
}
}
else{
buttons[0].setenabled(true);
buttons[1].setenabled(false);
buttons[2].setenabled(false);
la.settext(00:00:00);
}
}
public void run(){
while(true){
try{
thread.sleep(1000);
}catch(exception e){
e.printstacktrace();
}//interruptedexception, e.printstacktrace()
}
if(th != null){//time 출력
la.settext(integer.tostring(integer.parseint(la.gettext())+1));
}
else
break;
}
//addwindowlistener(new windowadaptor(){
public void windowclosing(windowevent e){
dispose();
system.exit(0);
}
//});
}
class bee{
public static void main(string args[]){
boo bo = new boo();
//new boo();
}
}
현재 컴파일 하면 프레임창이 떠서 구성한 버튼은 볼 수 있습니다.
소스는 에러상태이지만요;;
현재 if문 등 라벨에 타임이 스레드에 의해 동작이 되어야 하는데,
현재의 컴터 시간을 받아오는 것이 아니라 00:00:00에서부터 시작이기 때문에
상당히 헷갈리고 있습니다. 시작했다가 멈추게 되는데, 멈춤에서 리셋이 아니라 시작 버튼을 눌렀을때
타임은 다시 00부터가 아니라 아까 멈춘 시점부터 표시가 되야 합니다.
리셋이야 리셋버튼을 눌렀을때 초기화하세요라는 조건을 주면 되는것이지만,
시간(시간은 time()인덱스에서 찾기가 힘드네요. 책에는 날짜 부분이라 응용이 쉽지 않습니다.)은
count로 1초씩 더하세요 하면 될것도 같은데요.
그러니까, 제생각에 문제점은 타임표현에 대해서 무지한것 같습니다;;
그리고 버튼 하나마다 스레드를 줘서, 멀티스레드개념으로 boolean을 사용해서 동작하는 것과
하나의 스레드로 동작하는 것이 크게 문제 되지는 않는지 궁금합니다.
꾸벅;;
-
이플
고맙습니다 +_+
해결해서 되는데로 올려보겠습니다 ㅎㅎ. -
아이뻐
또 다른 방법으로는,
Thread를 사용해서 Thread.sleep(1000); 마다 notify 시키는 방법이 있을겁니다.
간단히 클래스를 구현해보자면
class StopWatch implemented Runnable{
public void run() {
while(true) {
try{
Thread.sleep(1000);
}catch(Exception e){}
// 이부분에서 이벤트 발생(1초증가)
-
맛깔손
System 클래스 함수중에 millsecond 단위로 현재의 long타입 값을 반환하는 함수가 있습니다.
보통은 어떤 함수의 수행속도 측정을 위해 사용을 하는데, 이 값을 이용하면 1000ms가 1초이므로 초단위로 카운트가 가능합니다. 그리고 아마도, 이미 자바 기본 지원 클래스중에 초단위로 반환하는 것이 있을 수도 있습니다.