В калитке, как я могу создать радиогруппы, которые не определены иерархией / расположением компонентов? - PullRequest
5 голосов
/ 02 ноября 2010

Я использую Wicket и хотел бы создать сетку из радио-кнопок, используя HTML, как показано ниже (внешние списки будут отображаться вертикально, внутренние списки будут отображаться горизонтально).

Количество групп является переменным - это могут быть ABC, ABCD, ABCDE и т. Д.

Я бы хотел, чтобы переключатели были сгруппированы по вертикали.

<ul>
  <li>
    <ul>
       <li><input type="radio" name="A"></li>
       <li><input type="radio" name="B"></li>
       <li><input type="radio" name="C"></li>
    </ul>
  </li>
  <li>
    <ul>
       <li><input type="radio" name="A"></li>
       <li><input type="radio" name="B"></li>
       <li><input type="radio" name="C"></li>
    </ul>
  </li>
  <li>
    <ul>
       <li><input type="radio" name="A"></li>
       <li><input type="radio" name="B"></li>
       <li><input type="radio" name="C"></li>
    </ul>
  </li>
</ul>

К сожалению, похоже, что RadioGroup позволяет группировать только радиокнопки в соответствии с группировкой, определенной их расположением.

Например:

RadioGroup group = new RadioGroup("radioGroupA");

group.add( new Radio("myradio", new Model(1)) ;

проблема в том, что я не могу выложить элементы так, как хочу.

Есть ли другой способ?Вручную указав имя и собрав результаты?

ОБНОВЛЕНИЕ: я заметил, что Radio может принимать RadioGroup в качестве параметра.Таким образом, можно сделать что-то вроде:

// create some groups
for (0..n) {
  RadioGroup group = new RadioGroup("myRadioGroup", new Model { .. } );
  groupArray.add(group)
}

//create a ListView for the RadioGroups so we can attach them to page
ListView radioListView = ListView("radioGroupList") { populate from groupArray }
add(radioListView);

// create our grid of radio buttons
// outer -> rows 
for (0..x) {
  // inner -> columns
  for (0..n)
    // supply group from our groupArray
    add( new Radio("myradio", new Model(1), groupArray.get(n) ));
  }
}

Затем я могу добавить Radio s и RadioGroup s к форме независимо от макета, что дает желаемый эффект с точки зрения группировки.

<form>
  <span wicket:id="radioGroupList">
     <span wicket:id="radioGroup"/>
  </span>
  <ul> 
    <li><radio wicket:id="myradio"/></li>

Но теперь, когда я отправляю сообщение, я получаю следующую ошибку:

WicketMessage: отправлено значение http post [radio33] для компонента RadioGroup [2: tContainer: list:2: tPanel: myForm: orderRadioGroupList: 0: orderRadioGroup] недопустима, поскольку она не содержит относительный путь к компоненту Radio.Из-за этого компонент RadioGroup не может разрешить выбранный компонент Radio, на который указывает недопустимое значение.Возможная причина заключается в том, что иерархия компонентов изменилась между рендерингом и отправкой формы.

Есть идеи, что это значит?

Слово "компонент" с ошибкой предполагает, что оно встречается не так часто.*

Я использую Wicket 1.4.12.

Я нашел этот билет Apache, который выглядит связанным: https://issues.apache.org/jira/browse/WICKET-1055

Ответы [ 2 ]

3 голосов
/ 03 ноября 2010

неверная иерархия компонентов.Радиокомпоненты должны быть внутри радиогруппы, как говорит их Javadoc.поскольку вы вложили группы радиосвязей, вы должны убедиться, что добавляемые вами компоненты Radio размещены внутри самого внутреннего экземпляра RadioGroup.поэтому ваша разметка должна выглядеть следующим образом:

<span wicket:id="group1">
    <span wicket:id="group2">
        <span wicket:id="group3">
            <ul>
                <li><input wicket:id="radio" type="radio"/>
                ...

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

0 голосов
/ 03 апреля 2014

Я немного попробовал и пришел к этому простому решению: Ура, andre

JAVA код:

RadioChoice<String> choice = new RadioChoice<>(
    "logger", new PropertyModel<>(model, "impl"), dao.getAvailableLoggers()
);
choice.setSuffix("\n");
form.add(choice);

Код разметки калитки:

<style type="text/css">
    .nowrap, .nowrap label {
        display: inline-block;
    }
</style>

<div class="nowrap">
    <wicket:container wicket:id="logger">x</wicket:container>
</div>
...