보통 컴포넌트는 컨테이너 add 되어 사용되어진다.

Panel panel = new Panel();
Label label = new Label("NAME CARD");
panel.add(label);


화면의 부드러운 표현을 위해 더블 버퍼링을 쓸 경우가 있는데, 이때 더블 버퍼링이 필요한 해당 객체-컴포넌트-단위로 더블 버퍼링을 구현해야지, 컴포넌트가 add되어 있는 컨테이너를 더블 버퍼링 구현하면 예상치 못한 경우가 발생한다.

이는 setVisible(false)를 통해 해당 컴포넌트를 표시하지 않을 경우, 상위 컨테이너의 update()메소드를 호출하여 화면을 지우고(clearRect()) setVisible(true) 상태의 자식 컴포넌트를 그리기 때문이다.

이때문에, 컨테이너의 update()를 오버라이딩할 경우, 지우는 효과가 없어져(clearRect()) 기존 그림이 그대로 남아있게 된다.

물론, 오버라이딩 이후 따로 화면 정리 코드를 삽입하면 달라지겠다.
2008/09/23 17:37 2008/09/23 17:37
Posted by 선물

난 힘이 세다.

 | 잡념
2008/05/12 00:07

난 힘이 세다.

결정적일 때 힘이 엄청나다.
.
.

난 힘이 약하다.

그 힘을 조절할 줄 모른다.

2008/05/12 00:07 2008/05/12 00:07
Posted by 선물
지마켓, 옥션 등 온라인 쇼핑과 같은 덩치 큰 온라인 쇼핑몰을 가지고 있지 않던 SK텔레콤이 야심차게 준비한 11번가.

TV를 보다보면 광고 10개 중에 하나는 11번가 광고가 아닐까란 생각도 해본다. 그만큼 많은 관심과 투자가 이뤄지고 있는게 아닐까 예상한다.

온라인 상에 보면 불평불만이 이만저만이 아니다.

과연 기존 대형 온라인 쇼핑몰과는 어떤 서비스 차이를 보여줄 것인가 하는 궁금증에 회원 가입을 작심했다.

헌데, 웃지 못할 상황이 나타난다.

"11번가"는 "Tossi" 서비스와 통합운영되고 있는데, 기존 "Tossi" 가입자가 "11번가"에 가입할 경우, "Tossi" 회원가입정보를 가져와서 기본정보를 자동입력해준다.

사용자 삽입 이미지


그런데, 막상 회원가입 페이지에 회원가입 버튼을 클릭하는 순간 황당한 문구를 볼 수 있다.

사용자 삽입 이미지


왜일까 싶어 가입자 정보란을 다시 보게 된다.

사용자 삽입 이미지


분명 아이디 정보가 입력되어 있고, 사용자가 임의로 수정할 수가 없다. 사용자가 입력할 수 있는 텍스트 상자가 아니다.

회원 관리의 시작점인 회원가입부터 이렇게 준비되어 있지 않다니 놀랍니다. 그것도 국내 굴지의 대기업이 운영하는 쇼핑몰이라니...

얼마나 테스트, 준비가 안되어 있는지 알 것 같다. 그것도 아주 테스트의 가장 첫부분부터.

혹시나 도움이 될까 싶어 고객센터에 문의를 남겼다.

사용자 삽입 이미지


핸드폰 연락처란도 있고, 고맙게도 SMS로 답신여부도 알려준단다. 메일은 기본이다.

질의를 한지 일주일이 지났는데, 어떤 답변도, 웹페이지의 수정도 없었다. 아니, 첫 언급에 수정한 결과가 저렇다. 첫 언급 때는 아이디 입력란이 수정이 가능했었다.

도대체 저걸 회사 신입도 아닌 초등학생한테 시키는 것인지...

이러다 국내 11번째 온라인 쇼핑몰이 되겠다.

"11번째 쇼핑몰 11번가입니다."
2008/03/20 12:46 2008/03/20 12:46
Posted by 선물

며칠을 고심 끝에, 찾아냈다고 해야하나 당연하다고 해야 하나...ㅡ,.ㅡa

이전 STB(셋탑박스)에 들어갈 미들웨어의 일부분이 될 application 인 SETUP 프로그램을 개발 중이었다.

TV STB인 관계로 프로그램을 시청하는 중에 "메뉴"버튼을 클릭하면 SETUP 메뉴가 나타나야 한다.

그러다 보니, SETUP 프로그램이 화면 전체를 가리지 않는 이상, SETUP 프로그램 뒤 배경에 영상이 나오게 된다.

디자인적인 미적 효과를 넣게 되면, 뒤 배경 영상 위로 알파값(alpha)을 적용해서 뿌옇게 처리한다던가 등의 왜곡(?)을 줄 수 있겠다.

그 알파값 적용을,

Color c = new Color(r,g,b,a);
g.setColor(c);
g.fillRect(x, y, width, height);

메소드를 통해 화면 구현을 했다.
이 내용을 더블버퍼링으로 변경하면,

Dimension d = getSize();
if ((offGraphics == null) || (d.width != offDimension.width) || (d.height != offDimension.height)) {
     offDimension = d;
     offImage = createImage(d.width, d.height);
     offGraphics = offImage.getGraphics();
}

// (1) offGraphics.clearRect(0, 0, d.width, d.height);
// (2) 최초 배경색으로 채운다. 알파값 적용.
offGraphics.setColor(getBackground());
offGraphics.fillRect(0, 0, d.width, d.height);
// (3) 원하는 알파값을 채운다.
offGraphics.setColor(new java.awt.Color(255, 0, 0, 45));
offGraphics.fillRect(0, 0, 500, 100);
//화면 개체를 그린다.
paintUI(offGraphics);
//실제 화면에 출력한다.
if (offImage != null)
   g.drawImage(offImage, 0, 0, null);

위와 같이 구현할 수 있다.
그런데, 알파값을 적용할 경우, 고려 사항이 있는데, 더블 버퍼링을 구현 함에 있어, 내부 버퍼에서 그림을 그리는 Graphics context를 초기화-clear- 를 하지 않으면, 실제 화면 출력시에 알파값 적용 부분이 처음부터 중첩이 되어 나타나게 된다. 즉, 알파값 적용 부분이 점점 진해져서 알파값 적용이 없어지게 된다.

이때에는, 필히 내부 버퍼의 Graphics context를 clear 해 주도록 하자.
위 코드에서 (1) 부분의 주석을 풀어주면 된다.

물론, 보이지않는 내부 버퍼이긴하나 영역 크기만큼 clear 시키는 거라 시간이 지연되긴 한다.

2008/03/10 18:18 2008/03/10 18:18
Posted by 선물
awt 에서 깜빡임을 줄이기 위해 더블 버퍼링을 구현하면 필수적으로 쓰게 되면 메소드가 createImage() 이다.

이 createImage() 메소드는 Component 의 메소드인데, 사용하다 보면 생각지도 않게 리턴값이 null 인 경우가 있다.

이는 createImage() 의 Component 인스턴스가 화면 컨테이너 개체(Frame, Window 등)에 add 되지 않아서 나타나는 현상인데, 급한 맘에 생성자 안에 호출하거나 컨테이너에 add 하기 전에 호출해 버리는 경우가 발생할 수도 있겠다.

필히 메소드 호출 전에 화면에 그려질 컨테이너 개체에 add() 메소드를 통해 등록시켜야 된다.

public class Test extends Canvas {

Frame frame = null;

public Test() {
.
.
frame = new Frame("Owner");
.
.
}

public void process1() {
.
.
frame.add(this);
.
.
}

public void process2() {
.
.
Image bufferImage = createImage(width, height);
.
.
}

public void go() {
process1();
process2();
}

}
2008/03/05 18:46 2008/03/05 18:46
Posted by 선물
SIGMA8634 chipset 기반에서 시스템 전반에 관여하는 SETUP 프로그래밍을 하고 있다.

havi ui API를 이용하지 않고 java awt api 만을 이용하여 개발 중이다. jvm 호환성만 의존한 상태로 다양한 플랫폼을 지원하기 위해서이다.

SETUP UI 를 개발하면서 가장 큰 애로사항 또는 고려할 점은,

1. 사용자 액션-리모콘 입력-에 따라 즉시 화면이 출력되어야 하므로 빠른 반응을 위해서 SETUP UI 는 미리 메모리에 객체 생성/초기화 되어 있어야 한다.(객체, 리소스(이미지, 사운드 등))

2. STB 과 같은 제한된 자원의 임베디드 환경이라는 점.

3. 메뉴 간 이동(전환) 빠르기가 적절해야 한다.

4. UI 가 편리해야 한다.

..정도로 생각할 수 있겠다.

이 중에서 구현하는 데 있어 깊은(?) 내공을 가지지 않고서는 힘든 부분이 있는데-다른 부분도 마찬가지지만..ㅡ,.ㅡa- , 3번을 고심해 볼 필요가 있다.

예로, A 메뉴가 있고, A 메뉴 내 B 서브 메뉴가 있는 등,

- A
----- B
----------- E
----------- F
----------- G
----- C
----- D

위와 같이 가정하면,

A 메뉴 내에는 B, C, D 메뉴가,
B 메뉴 내에는 E, F, G 메뉴가 구성되어 있다는 것을 알 수 있다.

즉, A 메뉴에서 B 메뉴를 선택하면, 화면이 바뀌면서 전체 화면이 B 메뉴가 주관이 된다.

이때, 전체 A 메뉴에서 B 메뉴로 바뀔 때,

여럿 graphics api 를 이용하여 실시간으로 그림을 그릴 것인지, 미리 화면을 그려놓았다가 화면 전환을 할 것인지는 개발자 몫이다.

하드웨어 성능이 뒷받침이 된다면야 실시간도 무리가 아니지만 임베디드라는 환경에서, 보통은 화면 깜빡임이 나타나는데-큰 화면을 부분적으로 그리더라도, 빠른 PC에서 조차도 나타난다.- 이를 방지하고자 더블버퍼링 기술을 쓰기도 한다.

그래서, 고심 끝에 각 메뉴별 장면을 미리 그려놓았다가 메뉴 전환시 메뉴별 장면을 바꿔치는 방법을 선택했다.-자원 문제에 대해서 다음에 다룬다.-

이를 쉽게 응용할 수 있는 방법으로, awt CardLayout 있었다.

CardLayout 은 장면 전환이 쉽게 되도록 지원하는 배치 관리자 중 하나인데, 카드를 여러 개 포개어 놓고, 필요한 카드만 보는 레이아웃이다.

처음 개발 중에는 저 레이아웃을 이용해 각 장면 단위로 어떤 컴포넌트를 이용할까 고민하다가 고른 것이 Canvas 였다.

java에서 그림 그리기 딱인 컴포넌트가 Canvas 이니까 말이다.

그래서 각 장면을 Canvas를 상속받아 Scene 이란 컴포넌트를 만들게 되었고, 아래와 같이 각 장면 컴포넌트는 CardLayout 에 이용해 출력했다.

//장면 생성
//MainMenu와 SystemMenu는 Scene을 상속
MainMenu mainMenu = new MainMenu();
SystemMenu systemMenu = new SystemMenu();
.
.
//장면을 출력할 container
Frame frame = new Frame("Setup");
Window window = new Window(frame);
//레이아웃매니저
CardLayout cardLayout = new CardLayout();
window.setLayout(cardLayout);
//장면을 등록
window.add("MainMenu", mainMenu);
window.add("SystemMenu", systemMenu);
.
.
//원하는 장면 출력
cardLayout.show(window, "MainMenu");
.
.
cardLayout.show(window, "SystemMenu");
.
.


위와 같은 형태로 코딩했다. 그리고 테스트를 수행...

그런데 생각지 못한 결과가 나왔다.

장면 전환시 깜빡임이 발생했다. 미리 장면을 다 그려놓고 장면을 바꿔치기 한 것 뿐인데 화면 깜빡임이 발생한 것이다.

시간 차를 주고 디버깅을 해보니, 분명 장면을 그리는 중에 나타나는 현상을 아닌 것 같았는데 한참이나 고심을 했다.

그런데 아주 쉽게 풀리는 열쇠를 발견 했으니, 장면이 상속받은 개체에 문제가 있었다.

쉽게 그림그리는 장면 단위만 생각해서 Canvas 개체를 가져다 쓴 것인데, 이게 jvm 내에서 Canvas를 교체할 경우-장면전환- 화면을 다시 지우는 현상이 있었다.

Canvas에서 Container 로 변경하니 깜빡임이 없어졌다.

//변경 전
public abstract class Scene extends Canvas
//변경 후
public abstract class Scene extends Container

Container 를 상속받느냐 Canvas를 상속받느냐에 따른 화면 처리 차이가 궁금해진다.

둘다 Component에서 시작한 것들인데 CardLayout에서 화면 출력시 처리가 다른 모양이다.

언제 찾아보기나 할까나~ ^^;;
2008/02/19 14:50 2008/02/19 14:50
Posted by 선물

메모하는 습관의 단점

 | 잡념
2008/01/23 11:01

사용자 삽입 이미지
성공하는 사람들이 으레 하는 말 중에 하나인 "메모".

분명히 "메모"는 세상을 거듭나게 하는 지대한 역할을 한다.

프랭클린 플래너를 사용하기 시작했고, 앉아있는 곳 주위에는 왠만해선 필기가 가능한 문구가 있다.

헌데, 나는 왜일까? 메모를 하기 시작하면서부터 자잘한 것까지-일상에서 기억해야 하는 것까지- 기억하기가 귀찮아지고, 적기 바쁘다.

기억하기가 싫어진다. 심지어 깜빡깜빡하기까지 하는 것 같다. 돌아서면 잊어버리니...ㅜ,.ㅜ
"메모"는 도리어 머릿 속 저장공간을 황폐화시키는 것인 줄도 모른다.

2008/01/23 11:01 2008/01/23 11:01
Posted by 선물
만족은 가난한 사람을 부자로 만들고, 불만은 부자를 가난하게 만든다.
- 벤저민 프랭클린
2008/01/16 16:24 2008/01/16 16:24
Posted by 선물

BLOG main image
내 안의 세상과 선물들을 펼쳐보이다. by 선물
우리가 함께 한 날로부터
2054 ...
내 생명이 온 날로부터
814 번째 날.

공지사항

카테고리

전체 (223)
여행 (6)
NAS (12)
Android (5)
JAVA (8)
FLEX (1)
모바일 (3)
Web (6)
IPTV (7)
컴퓨터기초 (1)
미투데이 (73)
잡념 (71)
푸념 (4)
문화생활 (2)
Mac (2)

글 보관함

달력

«   2008/01   »
            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          
Total : 1164691
Today : 18 Yesterday : 67