GWT - 查找在动态生成的Radiobutton列表中选中的按钮

时间:2013-02-24 12:35:34

标签: gwt

我有一个for循环,显示文本字段和单选按钮列表。 引用小部件的最佳方法是什么,以便我可以读取文本字段并查找选中的单选按钮。 这是我的循环

    for(int x = 0; x<getLoopCount(); x++)
    {
        answerTable.setWidget(x,0, new Label("Answer:"));
        answerTable.setWidget(x,1, new TextBox());
        answerTable.setWidget(x,2, new RadioButton(""));
    }

有没有办法识别每个小部件,以便我可以参考它?

3 个答案:

答案 0 :(得分:0)

您可以在创建时ValueChangeHandler添加RadioButton

for(int x = 0; x<getLoopCount(); x++){

    answerTable.setWidget(x,0, new Label("Answer:"));
    answerTable.setWidget(x,1, new TextBox());

    RadioButton rb = new RadioButton("");
    rb.addValueChangeHandler(new ValueChangeHandler(){
        @Override
        void onValueChange(ValueChangeEvent<Boolean> event){
            // Do something
        }
    });

    answerTable.setWidget(x,2, rb);

}

ValueChangeEvent仅在选中RadioButton时触发。如果检查同一组中的另一个RadioButton,则不会触发。

由于您在创建ValueChangeHandler时添加了RadioButton,因此您应该知道如何使用{{1}},而无需为其创建ID。

答案 1 :(得分:0)

我建议将这三个小部件组合在一个复合小部件中,如下所示:

class AnswerComposite extends Composite {
    private final Label label;
    private final TextBox textBox;
    private final RadioButton radioButton;

    public AnswerComposite() {
        label = new Label("Answer:");
        textBox = new TextBox();
        radioButton = new RadioButton("answerGroup");

        HorizontalPanel contentPanel = new HorizontalPanel();
        contentPanel.add(label);
        contentPanel.add(textBox);
        contentPanel.add(radioButton);

        initWidget(contentPanel);
    }

    public String getText() {
        return textBox.getValue();
    }

    public boolean isSelected() {
        return radioButton.getValue();
    }
}

然后,您可以将它们添加到面板和/或将它们放在如下列表中:

VerticalPanel answersPanel = new VerticalPanel();
List<AnswerComposite> answerComposites = new ArrayList<AnswerComposite>();

for (int i = 0; i < getLoopCount(); i++) {
    AnswerComposite answerComposite = new AnswerComposite();
    answersPanel.add(answerComposite);
    answerComposites.add(answersComposite);
}

检查你的小部件然后变得非常容易:

answerComposites.get(i).getText();
answerComposites.get(i).isSelected();

ValueChangeHandler添加RadioButton可能也很方便(参见enrybo的回答)。

答案 2 :(得分:0)

让我给你一个特别的答案,所以不要关心语法,而是关心算法的想法。

  1. 扩展GWT按钮。
  2.     abstract class MyButton
        extends Button{
          // provide the appropriate constructor in impl class,
          // especially if using uibinder
    
          abstract public void helloDolly(... args ...);
        }
    
    1. 使用MyButton实例化所有这些按钮。

      MyButton[] buttons = {
        new MyButton(){
           public void helloDolly(... args ...){
             Window.alert("allo allo #1");
           }
        },
      
        new MyButton(){
           public void helloDolly(... args ...){
             Window.alert("allo allo #2");
           }
        },
      
        // blah blah black sheep ....
      }
      
    2. 在定义处理程序时使用clickEvent.getSource()。

      buttons[i].addEventHandler(
        new ClickHandler(ClickEvent click){
          Object src = click.getSource();
          if (src !instanceOf MyButton){
             throw new MyAngryException("For goodness' sake, pls use MyButton");
             // or ignore
             return;
          }
      
          ((MyButton)src).helloDolly(... args ...);
        }
      )