2008. 12. 3. 23:16 Computer/JAVA

SWT 투명이미지


프로젝트 초기 배경이 없는 이미지를 Composite에 투명이미지를 올려 놓으면 Composite의 태두리가 남아 투명한 이미지를 사용하지 못했다.

Composite의 시작 좌표부터 크기만큼 Composite이 올라가는 배경이미지를 그린다음 Composite에 투명 이미지를 그려서 투명한 효과를 냈다.

그렇게 사용하다 SWT API를 보니 TRANSPARENT를 발견했다.
SWT 3.4버전 부터 사용가능한 투명화 메소드.

사용방법도 간단하다 SWT style에 SWT.TRANSPARENT를 추가하면 Composite에 한해 투명해지게 된다.

label은 투명이 안된다. 1~2개월 전에 테스트 했으니 지금도 안될 것 같다.

SWT는 Swing과 달리 개발 진행이 한창인 것 같다.

Posted by 천류성

이번 프로젝트를 진행하면서 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를 잘 다루는 사람들의 책을 읽고 그들의 방식대로 사용을 해 본후의 생각은 지금의 생각과 다를 거라고 생각을해본다.

Posted by 천류성


     Runnable longJob = new Runnable() {
             boolean done = false;

             int id;

             public void run() {
               Thread thread = new Thread(new Runnable() {
                public void run() {
                   display.syncExec(new Runnable() {
                     public void run() {
                      try{
                       Thread.sleep(5000);
                      }catch(Exception e){
                      
                      }
                     }
                   });

                   done = true;
                   display.wake();
                 }
               });
               thread.start();
               while (!done && !compo.isDisposed()) {
                 if (!display.readAndDispatch())
                   display.sleep();
               }
             }
           };
           BusyIndicator.showWhile(display, longJob);


출처 : Java2s.com
본문에서 약간 수정한 부분이 있습니다.

Posted by 천류성


BigDecimal의 내용을 알고 싶다면 아래 링크로가서 보시길 바랍니다.

부동 소수점의 정확한 계산... 

BigDecimal을 사용하고나서 이에 대한 내용을 찾아 봤는데 부동 소수점에 대한 생각지도 못한 문제점.

개발 분야에 따라 사용 빈도가 다르겠지만 알아두면 좋은 내용.  

http://www.yunsobi.com/tt/subby/227

Posted by 천류성

오버라이딩은 상위 클래서의 메소드의 이름, 타입, 매개변수가 같아야한다.

인터페이스나 추상클래스를 상속받아 메소드 구현을 하면 그게 오버라이딩이다.
다형성도 매한가지.

Runnable 인터페이스에 run() 메소드가 떵그러니 놓여져있다.
}
public abstract void run(); 이렇게 되어있나?
{

아무런 내용없는 Runnable 인터페이스를 implements 해서 구현을 하면 

run(){    
        내용
         }
Thread가 돌아가는 부분을 구현하게 된다. 이게 오버라이딩이다.

상속받은 run()과 타입, 이름, 매개변수가 똑같은 run()이 하위에 상속받은 클래스에있게 된다. Runnable 인터페이스의 run()은 하위 클래스에 남아 있으나 새로 구성한 run()에의에 숨겨진다.

그렇게 이해하기 힘들었던 오버로딩과 오버라이딩... 이해하기 힘들었던 이유는 안해서 그런거 같다 -_-;;

그리고 오버로딩....

방에 성은 김 씨를 갖고 이름은  다른 사람이 10명이있다면.
방문을 열고 "김씨" 나와요 이러면 10명이 처다 볼 것이고, " 김 길동 "씨 나와요 이러면 한명이 일어설 것이다.
성은 메소드명이고 이름은 파라매터라고 생각하면된다. 이름은 같으나 파라매터가 다른 메소드. 오버로딩 쉽지 않은가? ㅎㅎ

Posted by 천류성
System.in.read() 입력을 받아 처리하기 위해 사용하는 클래스.

입력을 하면 문자로 저장되기 때문에 숫자의 처리를 위해서

System.in.read() - '0'; 이나 '48'을 빼면된다.
Posted by 천류성
이전버튼 1 이전버튼

블로그 이미지
.....
천류성

태그목록

공지사항

Yesterday
Today
Total

달력

 « |  » 2024.3
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함