[자바] JTable setCellEditor 버그 getCellEditor 로 잡는다.

2023. 5. 6. 19:49Java

작성일 : 2009. 10. 20.
 
지긋지긋하고 징그러운 자바 기술. 스윙버그 피하느라 힘들다.
 
4년 전부터 고민해오던 부분이다.
 
JTable 에서 특정 컬럼의 에디터로써 JComboBox 를 사용하는 경우 다음과 같은 문제와 맞딱드리게 된다.
 
1. 열(ROW) 이 달라도 행(COLUMN) 이 같으면 동일한 에디터가 사용된다.
2. 같은 행이지만 각각의 열마다 다른 데이터를 보여주려고 매번 새 JComboBox 를 추가해주어도
편집 이벤트 발생 시 마지막으로 편집한 (행,열)의 Focus 를 물고 있어서 기존 에디터를 보여준다.
특히, 새 에디터를 보려면 JComboBox 를 안쓰는 다른 열을 클릭했다가 다시 클릭해주어야 제대로 보여주기도 한다.
 
다행히도 setter 의 반대인 getter 를 쓰면 이런 문제를 해결할 수 있다.
 
JTable 변수를 정의할 때, 생성자 안에 getCellEditor() 메소드를 내장함으로써 반환값이 바뀌도록 유도하는 방식이다. 아래처럼 >
 

 
 
설정이 불필요한 부분은 super 를 그대로 연결하면 된다.
위의 예에서는 row (열)마다 미리 지정된 String 배열 값을 읽어서 보여준다.
 
"terminateEditOnFocusLost" 는 제대로 동작하는지 모르겠지만 그냥 붙인다.
그냥 부적같은 거라고 할까. 포커스를 잃을 때 열린 에디터 창을 닫게 하는 기능이다.