Welcome to My World (www.dgmayor.com)

소프트웨어 (과거)/자바 GUI & C# 등...

9. 자바 쓰레드 상속 예제... 자동차 경주

dgmayor 2022. 2. 3. 17:53
728x90
package Bank;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Bank extends JFrame{
class MyThread extends Thread{
int x,y;
JLabel label;

public MyThread(String img,int x,int y) {
this.x=x;
this.y=y;

label = new JLabel();
ImageIcon icon = new ImageIcon(img);
label.setIcon(icon);
label.setBounds(x,y,300,300);
add(label);
}

@Override
public void run() {
for(int i=0;i<200;i++) {
x+=(Math.random()*10); //0~9
label.setBounds(x,y,300,300);

try {
Thread.sleep(100);
}catch(InterruptedException e) {
e.printStackTrace();
}

}
}
}

public Bank() {
setTitle("차 경주 게임");
setSize(600,250);

MyThread car1 = new MyThread("C:/WorkPlace/StarCraft/src/Drone.png",300,0);
MyThread car2 = new MyThread("C:/WorkPlace/StarCraft/src/Probe.png",300,300);
MyThread car3 = new MyThread("C:/WorkPlace/StarCraft/src/SCV.png",300,600);

car1.start();
car2.start();
car3.start();

setVisible(true);
}

public static void main(String[] args) {
new Bank();
}
}
 

우선 GUI와 쓰레드를 둘다사용해야하는데 클래스는 한 클래스밖에 상속을 못받기때문에 Cargame클래스는 GUI를 담당하는 JFrame을 상속받고 inner class MyThread클래스를 만들고 Thread를 상속받는식으로 구현했다.
main에서 CarGame클래스의 생성자를 호출하고 생성자 내부에서 실행창의 제목과 크기를 지정해주고 MyThread클래스에 대한 객체를3개만들고 생성자의 인자값으로 자동차이미지와 x,y값을 보낸다.
MyThread생성자에서 인자를 받고 x,y값을 변수에 넣고 label객체를 만든다. label객체는 글자를 넣을때 많이쓰는데 setIcon메소드로 이미지도 넣을수있다. 인자로 받아온 img를 이용해서 label에 이미지를 넣고 setBounds메소드로 위치를 지정해주고 add label을 화면에 추가해준다.
그리고 각각의 객체의 start메소드를 호출하면 쓰레드를 상속받은 MyThread클래스 내부의 오버라이딩한 run메소드가 자동으로 호출되고 메소드 내부에서는 for문으로 x위치값을 random값으로 뽑아서 그만큼 x값을 재설정해주는식으로 구현해서 자동차가 움직이게 보이도록 했다. 그리고 sleep메소드로 0.1초씩 딜레이를 준다. sleep메소드를 사용하기위해선 예외처리를 해줘야대서 예외처리까지 try ~ catch문으로 해주었다. 그리고 마지막으로 다시 CarGame클래스의 생성자로 돌아와서 setVisible메소드를 true값으로 실행시켜주면 잘동작하게된다.
 

거노님의 블로그에 펌 하였으나.... 쓰레드 및 move 익히기에 유용한 소스...

 

 

애니메이션 한 방법이 기억이 안 난다.

728x90