Есть ли способ автоматически генерировать идентификаторы в SWT-виджетах, поэтому пользовательские интерфейсы могут ссылаться на них? Я знаю, что могу вручную установить идентификатор с помощью seData, но я хочу реализовать эту функцию для существующего приложения несколько универсальным способом.Автоматически генерировать идентификаторы в SWT-виджетах
ответ
Вы можете рекурсивно назначать идентификаторы для всех своих оболочек в своем приложении, используя 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());
Ссылки
- 1. Как автоматически генерировать идентификаторы в mysql через hibernate?
- 2. PreparedStatement в ItemPreparedStatementSetter, который позволяет db-engine автоматически генерировать идентификаторы
- 3. Postgres: генерируют идентификаторы автоматически
- 4. Генерировать автоматические идентификаторы
- 5. JQuery генерировать уникальные идентификаторы
- 6. Как генерировать случайные идентификаторы
- 7. Как автоматически генерировать идентификаторы для @ElementCollection, когда это java.util.Map?
- 8. Как генерировать случайные идентификаторы Base36
- 9. генерировать случайные идентификаторы сеансов OpenTok
- 10. Генерировать уникальные буквенно-цифровые идентификаторы
- 11. Postgresql: генерировать инкрементные идентификаторы в выборе
- 12. Автоматически генерировать html-код
- 13. Vim автоматически генерировать Ctags
- 14. Генерировать div автоматически mysql_fetch_array
- 15. Автоматически генерировать ввод
- 16. Автоматически генерировать класс C#
- 17. Автоматически генерировать новую миграцию
- 18. генерировать скрипты автоматически
- 19. Генерировать автоматически имя листов
- 20. MongoDB: автоматически генерируемые идентификаторы обнуляет
- 21. PHP - Будет ли uniqid() генерировать алфавитные идентификаторы?
- 22. Как автоматически создавать пользовательские идентификаторы в Mongoose?
- 23. Yii2 - автоматически генерировать атрибут placeholder
- 24. Как автоматически генерировать Model & CRUD
- 25. Генерировать автоматически DataTable из XML
- 26. JPA первичный ключ автоматически генерировать
- 27. NUnit. Как автоматически генерировать тесты?
- 28. Автоматически генерировать перевод SiteTree в Silverstripe
- 29. Как автоматически генерировать имя функции в математике?
- 30. Как автоматически генерировать пароли в Rails Devise?