2012-12-05 3 views
5

Есть ли способ автоматически генерировать идентификаторы в SWT-виджетах, поэтому пользовательские интерфейсы могут ссылаться на них? Я знаю, что могу вручную установить идентификатор с помощью seData, но я хочу реализовать эту функцию для существующего приложения несколько универсальным способом.Автоматически генерировать идентификаторы в SWT-виджетах

ответ

8

Вы можете рекурсивно назначать идентификаторы для всех своих оболочек в своем приложении, используя Display.getCurrent().getShells(); и Widget.setData();.

Установка идентификаторов

Shell []shells = Display.getCurrent().getShells(); 

for(Shell obj : shells) { 
    setIds(obj); 
} 

У вас есть доступ ко всем активным (не выбывших) Корпуса в приложении с помощью метода Display.getCurrent().getShells();. Вы можете прокручивать все дочерние элементы каждого из Shell и назначать идентификатор каждому Control способом Widget.setData();.

private Integer count = 0; 

private void setIds(Composite c) { 
    Control[] children = c.getChildren(); 
    for(int j = 0 ; j < children.length; j++) { 
     if(children[j] instanceof Composite) { 
      setIds((Composite) children[j]); 
     } else { 
      children[j].setData(count); 
      System.out.println(children[j].toString()); 
      System.out.println(" '-> ID: " + children[j].getData()); 
      ++count; 
     } 
    } 
} 

Если Control является Composite он может иметь контроль внутри композита, что причина, я использовал рекурсивное решение в моем примере.


Поиск управления по ID

Теперь, если вы хотите, чтобы найти контроль в одном из своих оболочек, я хотел бы предложить аналогичную, рекурсивный, подход:

public Control findControlById(Integer id) { 
    Shell[] shells = Display.getCurrent().getShells(); 

    for(Shell e : shells) { 
     Control foundControl = findControl(e, id); 
     if(foundControl != null) { 
      return foundControl; 
     } 
    } 
    return null; 
} 

private Control findControl(Composite c, Integer id) { 
    Control[] children = c.getChildren(); 
    for(Control e : children) { 
     if(e instanceof Composite) { 
      Control found = findControl((Composite) e, id); 
      if(found != null) { 
       return found; 
      } 
     } else { 
      int value = id.intValue(); 
      int objValue = ((Integer)e.getData()).intValue(); 

      if(value == objValue) 
       return e; 
     } 
    } 
    return null; 
} 

С метод findControlById() вы можете легко найти Control по его ID.

Control foundControl = findControlById(12); 
    System.out.println(foundControl.toString()); 

Ссылки

Смежные вопросы