0

我有一个显示文本字段和单选按钮列表的 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(""));
    }

有没有办法识别每个小部件以便我可以引用它?

4

3 回答 3

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您应该知道如何处理它,而无需为其创建 ID。

于 2013-02-24T13:14:52.487 回答
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();

将 a 添加ValueChangeHandler到您RadioButton的 s 可能也很方便(请参阅 enrybo 的答案)。

于 2013-02-24T16:36:11.933 回答
0

让我给你一个临时答案,所以不要关心语法而是算法思想。

  1. 扩展 GWT 按钮。
    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 ...);
      }
    )
    
于 2013-02-24T17:10:07.337 回答