Хотите создать пользовательский компонент, отражающий функциональные возможности существующих компонентов, но с использованием другого средства визуализации.

Компоновка JSF-компонента SelectOneRadio очень ограничена, поэтому я написал для нее собственный Renderer, и он прекрасно работает. Однако бывают случаи, когда я хочу использовать и стандартный макет SelectOneRadio. Поэтому я решил сделать свой новый компонент, который использует созданный мной пользовательский рендерер, но я хочу, чтобы этот новый компонент отражал функциональность SelectOneRadio, и единственное отличие состоит в том, что он будет использовать мой рендерер. Нужно ли мне создавать и custom tag, и custom component, чтобы использовать мой custom renderer в этом случае? Какие class мне нужно расширить, чтобы получить все функции от SelectOneRadio? Я был бы очень признателен, если бы вы могли предоставить некоторые коды.

EDIT
@BalusC: мне нравится ваша идея об определении значения layout для делегирования правильного средства визуализации. Итак, если у меня есть layout="div_layout", то он отлично работает, но если это pageDirection или lineDirection, ничего не появляется. Что я сделал, так это: я создал класс, который extends MenuRenderer, и я переопределяю метод encodeEnd, поэтому я сделал это

String layout = (String) component.getAttributes().get("layout");

if(layout != null){
        if(layout.equals(PAGE_DIRECTION) || layout.equals(LINE_DIRECTION)){
            super.encodeEnd(context, component);
            return;
        } else if (!layout.equals(DIV_LAYOUT)){
            //Throw error message
        }
}
//Continue with my own renderer code

EDIT2
Когда выше я сказал, что ничего не отображается, я ошибался. super.encodeEnd (контекст, компонент); сделал рендеринг, но вместо рендеринга радио он рендерит тег select option. Так что кажется, что я делегирую не тому рендереру. Мне нужно использовать RadioRenderer вместо MenuRenderer.


person Thang Pham    schedule 07.07.2012    source источник


Ответы (1)


Если это относится к вашему собственному веб-приложению, вы можете заменить только средство визуализации. Проще всего расширить средство визуализации для конкретной реализации, а затем, в зависимости от значения одного из стандартных атрибутов (наилучший выбор — layout), либо делегировать средство визуализации для конкретной реализации, либо выполнить собственное задание по визуализации.

В случае Mojarra вы хотите расширить com.sun.faces.renderkit.html_basic.RadioRenderer, а затем зарегистрируйте его следующим образом.

<renderkit>
    <renderer>
        <component-family>javax.faces.SelectOne</component-family>
        <renderer-type>javax.faces.Radio</renderer-type>
        <renderer-class>com.example.ExtendedRadioRenderer</renderer-class>
    </renderer>
</renderkit>

Если вы хотите быть независимым от реализации, вам нужно будет написать всю реализацию рендерера самостоятельно.

Если вы хотите иметь для него пользовательский компонент, вам также нужно будет написать его самостоятельно.

person BalusC    schedule 07.07.2012
comment
Я думаю, что я перепроектировал это. Ваша идея об обнаружении атрибута layout и делегировании его правильному средству визуализации кажется лучше. У меня это почти работает правильно, пожалуйста, вернитесь к моему исходному сообщению, так как у меня есть еще один вопрос. Большое Вам спасибо. - person Thang Pham; 08.07.2012
comment
Выше, когда я сказал, что ничего не появляется, я был неправ. super.encodeEnd(context, component); сделал рендеринг, но вместо рендеринга radio он рендерил тег select option. Так что кажется, что я делегирую не тому рендереру. Вы случайно не знаете правильный рендерер? - person Thang Pham; 09.07.2012
comment
Как указано в моем ответе, вы должны расширить RadioRenderer, а не MenuRenderer. MenuRenderer для <h:selectOneMenu>. - person BalusC; 09.07.2012
comment
Извините, я видел это прошлой ночью. Я смог заставить его работать прошлой ночью. Тем не менее, код все еще навязчив. Я все еще ищу способ сделать его менее навязчивым. - person Thang Pham; 09.07.2012
comment
Вы имеете в виду независимость от реализации? Тогда не расширяйте средство визуализации для конкретной реализации, а напишите весь код самостоятельно. Для компонентной части вы можете расширить стандартный JSF HtmlSelectOneRadio. - person BalusC; 09.07.2012