Задача - назначить UI-делегата MyComponentUI для компонента MyComponent.
Самый простой способ назначить UI-делегата для компонента - вызвать метод setUI, передав параметром эеземпляр UI-делегата.
Можно выполнить эту же операцию неявно, то есть не создавая явно экземпляр UI-делегата:
Метод getUIClassID() возвращает идентификатор UI-делегата.
Класс UIManager хранит пары ключ-значение для параметров компонент Swing - это некий реестр. В частности, из этого класса берутся параметры для инициализации UI-делегатов.
Внутри метода UIManager.getUI(this) происходит инициализация делегата для данного компонента: берется идентификатор UI-делегата (getUIClassID()), по нему берется название класса UI-делегата, а по названию берется класс UI-делегата (более подробно можно посмотреть в исходнике метода).
Таким образом в методе updateUI мы заносим значения в UIManager, и вызываем установку (а значит и неявную инициализацию) UI-делегата. Естественно, что внесение значений логичнее вынести в отдельный класс.
Далее в классе UI-делегата ищется статический метод createUI, который и должен вернуть экземпляр делегата:
Данный способ используется в пакете JIDE. Собственно, заметка написана после изучения отдекомпиленных сорцов JIDE.
Самый простой способ назначить UI-делегата для компонента - вызвать метод setUI, передав параметром эеземпляр UI-делегата.
ComponentUI myUI = new MyComponentUI(); component.setUI(myUI);
Можно выполнить эту же операцию неявно, то есть не создавая явно экземпляр UI-делегата:
public class MyComponent extends JComponent {
@Override
public void updateUI() {
if (UIManager.get("MyComponentUI")==null) {
UIManager.put("MyComponentUI", "foo.MyComponentUI");
UIManager.put("foo.MyComponentUI", MyComponentUI.class);
}
setUI(UIManager.getUI(this));
}
@Override
public String getUIClassID() {
return "MyComponentUI";
}
}
Метод getUIClassID() возвращает идентификатор UI-делегата.
Класс UIManager хранит пары ключ-значение для параметров компонент Swing - это некий реестр. В частности, из этого класса берутся параметры для инициализации UI-делегатов.
Внутри метода UIManager.getUI(this) происходит инициализация делегата для данного компонента: берется идентификатор UI-делегата (getUIClassID()), по нему берется название класса UI-делегата, а по названию берется класс UI-делегата (более подробно можно посмотреть в исходнике метода).
Таким образом в методе updateUI мы заносим значения в UIManager, и вызываем установку (а значит и неявную инициализацию) UI-делегата. Естественно, что внесение значений логичнее вынести в отдельный класс.
Далее в классе UI-делегата ищется статический метод createUI, который и должен вернуть экземпляр делегата:
public class MyComponentUI extends ComponentUI {
public static ComponentUI createUI(JComponent jcomponent) {
return new MyComponentUI();
}
}
Данный способ используется в пакете JIDE. Собственно, заметка написана после изучения отдекомпиленных сорцов JIDE.
No comments :
Post a Comment