가끔 문서를 제대로 읽지 않아서 삽질하는 경우가 있기는 하지만 이번엔 정말 대박인듯..

swing은 thread 에 안전하지 않다는 문구는 여기 저기 돌아 댕기고.. api 내에 설명까지 하고 있지만.. Swing을 자주 사용하지 않을 뿐더러.. 테스트용 어플만 만들다 보니 이런 실수가 발생되는 듯.

우선은 데이터 추출하는 Thread 에서 아이템을 차례대로 JList에 삽입함과 동시에 마지막 아이템을 select 하고 싶고, 스크롤을 마지막으로 보내고 싶다는 단순한 생각이 이렇게 삽질하게 만들줄은 꿈에도 생각못 함. 쩌ㅃ~

우선은 스크롤을 마지막으로 보내는 ensureIndexIsVisible() 요넘을 Thread 에서 사용하면 exception 이 발생된다. 뭐 이때 사용하라고 있는 넘이 SwingUtilities.invokeLater 요넘인건 기초중에 기초인데.. 왜 자꾸 까먹고 실수 하는 건지.. ㅡㅡ;;

Example
public void run() {
..............................
jList.setListData(v);
jList..setSelectedIndex(v.size()-1); // 마지막 아이템 select 하자

 SwingUtilities.invokeLater(new Runnable() {  // Thread safety 하게 만들자..
        public void run() {
            jList.ensureIndexIsVisible(jList.getSelectedIndex());
        }
});
}

위 샘플 코드를 보면 쓰레드에 안전하지 않은 넘을 쓰레드에 안전하게 만들어.. race condition 을 해결한다.

ps.
다음번에도 같은 실수를 반복할까? 머릿속의 지우개가 결정할 문제일 듯 쩌ㅃ~

'java > swing' 카테고리의 다른 글

[swing] - SwingX  (0) 2010.10.27
[swing] - 메시지 박스  (0) 2010.07.19
[swing] - look and feel  (0) 2010.06.30
[swing] - JFileChooser 사용하자  (0) 2010.06.30
[swing] - JTableHeader 값 중앙에 배치하기  (0) 2010.06.30
Posted by 짱가쟁이