쓰레드를 이용한 이미지 repaint() 질문입니다..
무들
요전 질문은 이 게시판과 성격이 맞지 않는것 같아서 자삭했습니다..ㅋ
예를 들어서 점이 다섯개가 있고 이를 A, B, C, D, E라고 했을대.. A - B - C - D - E - A 의 루트로
이동하는 트럭 이미지를 쓰레드를 이용하여 구현하고 있는데요..
-------------------------------------------------------------------------------------------------
if(e.getSource() == b_find) {
isStart = true; // 버튼 이벤트가 발생했을 경우 값을 true로 바꿉니다.
this.SelectionSort(dp, dp.length-1); //포인트를 소트합니다. (dp :DPoint라는 포인트 관리 클래스를 만들었습니다)
for(int i=1; idp.length; i++) {
if(i == dp.length-1) { // 점이 5개 있을 때 dp[4] 와 dp[1]을 비교하기 위해서 만들었습니다.
x1 = dp[i].getX();y1 = dp[i].getY();
x2 = dp[1].getX();y2 = dp[1].getY();
double a = (double)(y2-y1) / (double)(x2-x1); // 기울기
double b = (double)(-a * x1 + y1);//y절편
if(a 0) { // 기울기가 0보다 크면 감소하면서 왼쪽으로 이동합니다
for(int j=x1; j=x2; j--) {
cur_x = j;
cur_y = a*j + b;
this.repaint(); // paint() 메소드 호출
//try {
//Thread.sleep(500);
//} catch(InterruptedException ie) {}
}
}
else { // 기울기가 0보다 작으면 증가하면서 오른쪽으로 이동합니다.
for(int j=x1; j=x2; j++) {
cur_x = j;
cur_y = a*j + b;
this.repaint(); // paint() 메소드 호출
//try {
//Thread.sleep(500);
//
//} catch(InterruptedException ie) {}
}
}
} else { // 일반적인 경우 현재 점과 다음 점 사이의 연산을 수행합니다.
x1 = dp[i].getX();y1 = dp[i].getY();
x2 = dp[i+1].getX();y2 = dp[i+1].getY();
double a = (double)(y2-y1) / (double)(x2-x1);
double b = (double)(-a * x1 + y1);
//System.out.println(( + x1 + , + y1 + ) + { + x2 + , + y2 + ));
//System.out.println((double)(y2-y1) + , + (double)(x2-x1));
//System.out.println(a);
//System.out.println(b);
if(a 0) {
for(int j=x1; j=x2; j--) {
cur_x = j;
cur_y = a*j + b;
this.repaint();
//try {
//Thread.sleep(500);
//} catch(InterruptedException ie) {}
}
}
else {
for(int j=x1; j=x2; j+;=x2; j++) {
cur_x = j;
cur_y = a*j + b;
this.repaint();
//try {
//Thread.sleep(500);
//
//} catch(InterruptedException ie) {}
}
}
}
}
isStart = false;
this.repaint();
}
}
---------------------------------------------------------------------------------------------------------
제가 구현한 paint() 메소드는 다음과 같습니다..
----------------------------------------------------------------------------------------------------------
public void paint(Graphics g) {
g.drawImage(img_back, 5, 5, 780, 580, this); // 화면상에기본 이미지를 뿌립니다.
if(dp != null) { // 좌표클래스가 null 이 아닐때 화면상에 좌표를 뿌려줍니다.
g.drawString(dp[1].getKey(), dp[1].getX()-14, dp[1].getY()+25);
g.setColor(new Color(0,0,255));
g.fillOval(dp[1].getX(), dp[1].getY(), 10, 10);
for(int i=2; idp.length; i++) {
g.setColor(new Color(0,0,0));
g.drawString(dp[i].getKey(), dp[i].getX()-15, dp[i].getY()+25);
g.setColor(new Color(255,0,0));
g.fillOval(dp[i].getX(), dp[i].getY(), 7, 7);
}
if(isStart == true) {// 이부분이 좀 문제인데요.. 위의 이벤트가 발생했을때 isStart를 true로 변경하였습니다.
g.drawImage(img_truck, (int)cur_x, (int)cur_y, 50, 50, this);
}
---------------------------------------------------------------------------------------------------------
결과는 무한루프가 도는지..실행이 멈춰버립니다.. ㅠ repaint()과정에 뭔가 문제가 있는것 같은데...
도움좀 요청할께요.. ^^
}
}
-----------------------------------------------------------------------------------------------------------
-
큰꽃
지금 소스로 보기에는 Thread를 이용했다고하는 하는데, Thread의 .start() 메소드는 보이지 않습니다.
Thread는 runnable를 기본적으로 implement를 하고 있구요.
run() 메소드를 오버라이딩해야 합니다.
자세한것은 책에서 Thread 관련 부분을 확인하세요~ ^^ -
Hotpants
음.. 쓰레드를 이용해서 뭔가 변화를 시키려면.. 꼭 runnable을 implement해서 run() 메소드 안에다가 구현해줘하는건가요??
-
로지
위의 링크 답변 중에 \창을 리사이즈 시키면 안 될꺼다\ 라는것은 환경에 따라서 다릅니다. ^^
창이 리사이즈가 된다고 해도, 안에 내용이 안 그려지게 될것입니다.