Задача - назначить 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