2017-11-08 10 views
3

SWT 컨트롤 클래스 TreeTable에는 동일한 방법으로 여러 가지 방법이 있으며 동일한 방식으로 작동합니다. 예를 들어SWT 트리 및 테이블에 공통 코드 작성

:

  • getItems
  • getSelection

그러나 이러한 방법은 TreeTable에 직접 정의는, 메소드가 선언 된 공통의 슈퍼 클래스 또는 인터페이스가 없습니다. 이 때문에 TreeTable 모두에 적합한 코드를 작성하기가 어렵습니다.

이 두 가지 클래스에 대한 공통 코드를 작성할 수있는 솔루션이 있습니까?

답변

3

가능한 해결책 중 하나는 Tree 또는 Table을 래핑하고 해당 메서드를 래핑 된 컨트롤에 위임하는 하위 클래스를 사용하여 일반적인 메서드로 클래스를 만드는 것입니다. 다음과 같이 할 수와 같은 클래스를 일반적인 코드를 사용

:

/** 
* Wrapps a {@link Tree} or {@link Table} to make it possible to work with them 
* in a generic way. 
* 
* This class could be an interface in Java 8, which allows static methods on interfaces. 
*/ 
public abstract class CollectionControl { 
    public abstract CollectionItem[] getItems(); 
    public abstract CollectionItem[] getSelection(); 
    public abstract int getSelectionCount(); 
    public abstract Control getControl(); 
    public abstract int getColumnCount(); 

    interface CollectionItem { 
     String getText(int columnIx); 
    } 

    /** 
    * @param control Either a {@link Tree} or {@link Table}.. 
    * @return A collection which wraps the argument an delegate method calls to it. 
    * @throws IllegalArgumentException if the argument is not a Tree or a Table. 
    */ 
    public static CollectionControl create(Control control) { 
     if (control instanceof Tree) { 
      return new TreeControl((Tree) control); 
     } else if (control instanceof Table) { 
      return new TableControl((Table) control); 
     } 

     throw new IllegalArgumentException(); 
    } 


    private static class TreeControl extends CollectionControl { 
     private Tree tree; 

     public TreeControl(Tree tree) { 
      this.tree = tree; 
     } 

     @Override 
     public CollectionItem[] getSelection() { 
      CollectionItem[] items = new CollectionItem[tree.getSelectionCount()]; 
      int ix = 0; 
      for (TreeItem item : tree.getSelection()) { 
       items[ix++] = new TreeCollectionItem(item); 
      } 
      return items; 
     } 

     @Override 
     public int getSelectionCount() { 
      return tree.getSelectionCount(); 
     } 

     @Override 
     public Tree getControl() { 
      return tree; 
     } 

     @Override 
     public CollectionItem[] getItems() { 
      CollectionItem[] items = new CollectionItem[tree.getItemCount()]; 
      int ix = 0; 
      for (TreeItem item : tree.getItems()) { 
       items[ix++] = new TreeCollectionItem(item); 
      } 
      return items; 
     } 

     @Override 
     public int getColumnCount() { 
      return tree.getColumnCount(); 
     } 

     private static class TreeCollectionItem implements CollectionItem { 
      private TreeItem item; 
      public TreeCollectionItem(TreeItem item) { 
       this.item = item; 
      } 
      @Override 
      public String getText(int columnIx) { 
       return item.getText(columnIx); 
      } 
     } 
    } 

    private static class TableControl extends CollectionControl { 
     private Table table; 

     public TableControl(Table table) { 
      this.table = table; 
     } 

     @Override 
     public CollectionItem[] getSelection() { 
      CollectionItem[] items = new CollectionItem[table.getSelectionCount()]; 
      int ix = 0; 
      for (TableItem item : table.getSelection()) { 
       items[ix++] = new TableCollectionItem(item); 
      } 
      return items; 
     } 

     @Override 
     public int getSelectionCount() { 
      return table.getSelectionCount(); 
     } 

     @Override 
     public Table getControl() { 
      return table; 
     } 

     @Override 
     public CollectionItem[] getItems() { 
      CollectionItem[] items = new CollectionItem[table.getItemCount()]; 
      int ix = 0; 
      for (TableItem item : table.getItems()) { 
       items[ix++] = new TableCollectionItem(item); 
      } 
      return items; 
     } 

     @Override 
     public int getColumnCount() { 
      return table.getColumnCount(); 
     } 

     private static class TableCollectionItem implements CollectionItem { 
      private TableItem item; 
      public TableCollectionItem(TableItem item) { 
       this.item = item; 
      } 
      @Override 
      public String getText(int columnIx) { 
       return item.getText(columnIx); 
      } 
     } 
    } 
} 
:

CollectionControl c = CollectionControl.create(treeOrTable); 
int nrItems = c.getSelectionCount(); 

이 다음은 클래스의 예입니다