이번 프로젝트를 진행하면서 SWT에 대해 많은 부분을 알게되었다.
많은 삽질을 통해 많은 걸 배웠는데. 정리 할 시간없이 내 기억속에서 사라져간 내용들이 많다.
먼저 동적 이미지 사용하기.
Swing은 동적 이미지 .gif를 불러오면 동적 이미지를 사용 할 수있다.
SWT는 gif파일을 불러오면 정지된 이미지를 불러온 것과 같은 이미지가 나온다. 결론은 움직이는 gif파일이 자기 역활을 못 한다.
이유는 생각 할 시간이 없었다. -_-;; 코피터지는 일정에 안되니까 되는 방법을 찾았다.
이미지를 순차적으로 그려주면 된다.
이걸 파일로 만들어 둔게 움직이는 이미지 파일이니까.
먼저 움직이는 이미지를 표현할 이미지들이 필요하다.
Composite을 상속받은 클래스를 생성하고
private void initImg() {
this.setSize(35, 35);
setLayout(null);
img = new Image[6];
img[0] = ImageFile.get_DeviceIcon_CoolingTowar_Run_FAN_1();
img[1] = ImageFile.get_DeviceIcon_CoolingTowar_Run_FAN_2();
img[2] = ImageFile.get_DeviceIcon_CoolingTowar_Run_FAN_3();
img[3] = ImageFile.get_DeviceIcon_CoolingTowar_Run_FAN_4();
img[4] = ImageFile.get_DeviceIcon_CoolingTowar_Run_FAN_5();
img[5] = ImageFile.get_DeviceIcon_CoolingTowar_Run_FAN_6();
if(!compo.isDisposed()){
this.addPaintListener(new PaintListener() {
public void paintControl(PaintEvent e) {
if (null != frameImage) {
e.gc.drawImage(frameImage, 0, 0);
}
}
});
}
}
public void setData(int ImageNum){
if(ImageNum < 7){
frameImage = img[ImageNum];
}
}
<이 코드는 프로젝트 진행중에 작성된 코드의 일부분이다.>
배열이 이미지를 등록해두고 Thread가 동작하면서 frameImage에 차래로 이미지를 끼우고 그 이미지를 Canvas에 있는 gc가 그려준다.
Thread의 모습
private synchronized void threadExe() {
while (flag) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
}
try{
if (!_fanMoveImage.isDisposed()) {
_fanMoveImage.getDisplay().asyncExec(new Runnable() {
public void run() {
if (!_fanMoveImage.isDisposed()) {
_fanMoveImage.setData(j);
_fanMoveImage.redraw();
}
// }
}
});
}
}catch(SWTException e){
e.printStackTrace();
}
j = j + 1;
if (j == 6) {
j = 0;
}
}
}
public void setCoolingTowerFanStatus(boolean flag){
this.flag = flag;
}
_fanMoveImage.setData(j); 순차적으로 숫자를 setData에 넣음으로 frameImage에 이미지가 변경된다. 그리고 외부에서 flag를 제어 함으로 Thread를 멈출 수 있게한다.
SWT를 많이 사용해 보고 프로젝트를 진행한게 아니라 프로젝트 진행을 하면서 SWT에 대해서 배우고있다.
아직은 SWT의 장점을 잘 모르겠다. 익숙한 Swing으로 했다면 지금 불편하게 작성한 코드들을 좀더 쉽게 작성했지 않았나라는 생각을 한다.
SWT를 잘 다루는 사람들의 책을 읽고 그들의 방식대로 사용을 해 본후의 생각은 지금의 생각과 다를 거라고 생각을해본다.