SMALL

SWT 의 Table(org.eclipse.swt.widgets.Table) 은 Table Cell 에 TableEditor 와 Widget을 추가해 줌으로써 Table Cell에 widget을 넣을 수 있다.

아래와 같은 테이블을 생각해보자.



하단데 New , Delete 버튼이 들어있고, New 버튼을 click 하면 한 row가 추가되고 Delete 버튼을 누르면 row 가 한칸 줄어 든다. 

Table 에 delete 기능 button을 넣기 위해 아래와 같은 코드가 필요하다.

table.remove(table.getSelectionIndex());

그런데 row를 줄일 때 문제가 발생한다.

일반적으로 이런 기능을 위해 Table.remove() , Table.removeAll() method를 부르지만 이렇게 되면 버튼들이 그대로 남아있게 되거나 삭제를 입력했음에도 불구하고 화면을 클릭해야 적용되는 현상이 나타난다.

이를 위해서는 해당 TableEditor 와 Button widget에 대해 dispose() method를 불러주면 된다.

이때 문제는 삭제대상 table item 의 특정 column의 widget 과 editor(위의 예에서는 2번 컬럼의 버튼 및 table editor)에 접근해야 하는데, 이런 접근을 위한 방법 자체를 제공하지 않는다는 것이다. 

고상하게 접근하려면 아래와 같은 방법을 생각할 수도 있을 것이다.

  1. tableItem 이 dispose 될 때 editor 와 widget 이 같이 dispose 되면 된다.

  2. 이를 위해 TableItem.addDisposeListener() 에 DisposeListener 를 만들어넣자.

item.addDisposeListener(new DisposeListener()
{
public void widgetDisposed(DisposeEvent e)
{
delBtn.dispose();
editor.dispose();
}
});

깔끔한 것 같으나, 이를 실행하면 아래와 같이 오류가 난다.
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 7
at org.eclipse.swt.widgets.Table.removeAll(Table.java:1904)
at Example.loadTable(Example.java:102)
at Example$1.widgetSelected(Example.java:72)


결국 위의 오류를 피하고 제대로 row를 삭제하기 위해서는 TableEditor , 해당 Widget을 일일이 관리해 줘야 한다. 특정 row 에 해당하는 TableEditor,Widget을 삭제하는 method를 만들던지 하는 방식을 생각할 수 있다. 아래 예제에서는 그냥 몽땅 다 List 에 들고 다니도록 했다.

((Text)getTable().getItem(getTable().getSelectionIndex()).getData("0")).dispose();
((Button)getTable().getItem(getTable().getSelectionIndex()).getData("1")).dispose();
((Button)getTable().getItem(getTable().getSelectionIndex()).getData("2")).dispose();
((Button)getTable().getItem(getTable().getSelectionIndex()).getData("3")).dispose();
((Button)getTable().getItem(getTable().getSelectionIndex()).getData("4")).dispose();
getTable().remove(getTable().getSelectionIndex());
getTable().pack();

SWT의 좋은 점도 많지만, Table 의 경우에는 에지간하면 Swing의 JTable을 쓰는것이 훨씬 낫지 않을까 생각된다. 조금 복잡해지기 시작하면 JTable이 오히려 훨씬 깔끔한 것 같다.




LIST