在wicket中,如何创建未由组件层次结构/布局定义的RadioGroup?

时间:2010-11-01 23:46:53

标签: java layout radio-button wicket

我正在使用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似乎只允许按照其布局定义的分组对单选按钮进行分组。

E.g:

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) ));
  }
}

然后我可以将RadioRadioGroup添加到表单中,与布局无关,这在分组方面具有所需的效果。

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

但现在,当我提交时,我收到以下错误:

  

WicketMessage:为RadioGroup组件提交了http post值[radio33] [2:tContainer:list:2:tPanel:myForm:orderedRadioGroupList:0:orderedRadioGroup]是非法的,因为它不包含无线组件的相对路径。由于这个原因,RadioGroup组件无法解析非法值指向的所选Radio组件。可能的原因是渲染和表单提交之间的组件层次结构发生了变化。

知道这意味着什么吗?

拼写错误的单词“componment”表明它不常见。

我正在使用Wicket 1.4.12。

我发现这张看起来相关的Apache票证:https://issues.apache.org/jira/browse/WICKET-1055

2 个答案:

答案 0 :(得分:3)

您的组件层次结构错误。无线电组件必须是内部无线电组组件,因为他们的javadoc说。由于您嵌套无线电组,您必须确保添加的无线电组件放在最内层 RadioGroup实例中。所以,你的标记应该是这样的:

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

当前代码的问题在于您使用的是ListView,它会从您的RadioGroups创建一个平面列表,而不是嵌套列表。并且,您将在组的层次结构之外添加无线电。

答案 1 :(得分:0)

我尝试了一下,来到这个简单的解决方案: 干杯,安德烈

JAVA代码:

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

Wicket Markup Code:

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

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