Monday, January 25, 2010

Неявное связывание компонента и UI делегата

Задача - назначить UI-делегата MyComponentUI для компонента MyComponent.


Самый простой способ назначить 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