Как отметил Фавониус, вы можете перехватывать события макета, такие как SWT.Resize
, чтобы определить, когда вы рисуете, и пересчитать свою дочернюю иерархию, добавив слушателей по мере необходимости. Другой вариант - просто прослушать все события фокуса и обратить внимание только на те, которые предназначены для интересующих вас элементов управления.
Display
s имеют фильтры , которые, подобно слушателям, уведомляются о событиях, однако фильтры отличаются тем, что они запускаются перед слушателями, у них есть возможность отменить события, и они уведомляются для всех типа события на весь Display
.
Таким образом, вы можете использовать Filter
, чтобы изучить все события фокуса и определить, интересует ли вас это. Например:
public class MyControl extends Composite
{
private final Listener focusListener;
public MyControl(final Composite parent, final int style)
{
/* initialize the control... */
focusListener = new Listener()
{
public void handleEvent(Event event)
{
if (!(event.widget instanceof Control))
{
return;
}
boolean isOurChild = false;
for (Control c = (Control) event.widget; c != null; c = c.getParent())
{
if (c == container)
{
isOurChild = true;
break;
}
}
if (isOurChild)
{
System.out.println("Our child is " + (event.type == SWT.FocusIn ? "focused" : "unfocused"));
}
}
};
getDisplay().addFilter(SWT.FocusIn, focusListener);
getDisplay().addFilter(SWT.FocusOut, focusListener);
addDisposeListener(new DisposeListener()
{
public void widgetDisposed(DisposeEvent e)
{
getDisplay().removeFilter(SWT.FocusIn, focusListener);
getDisplay().removeFilter(SWT.FocusOut, focusListener);
}
});
}
}
Запомните javadoc для предупреждений Display
об использовании фильтров:
Их, как правило, следует избегать по соображениям производительности, отладки и обслуживания кода.
Очевидно, что вы смотрите на компромисс производительности в любом решении - в зависимости от того, какое приложение вы поставляете, и от рабочего процесса ваших пользователей, может иметь смысл добавить фокус-слушателей при изменении размера или больше смысла просто слушать все фокусные события и игнорировать те, которые вас не интересуют.