0

ユーザーが記入するアンケートを作成しています。要件の1つは、ユーザーが質問に回答すると記入される進行状況バーを実装することです。

頭を完全に包み込むことができないバグは、リストボックスにあります。値を選択するとカウンターは問題なく上昇しますが、別の値を選択すると、同じ値を維持する必要があるときにカウンターが再び増加します。

以下の基本的な例:

  • 値を選択
    • TRUE
    • FALSE

完了率:0%(デフォルト値として「値の選択」を含むデフォルトのドロップダウンリスト)

  • TRUE
    • 値を選択
    • FALSE

完了率:2%

  • FALSE
    • 値を選択
    • TRUE

完了率:4%(質問はすでに回答されているため、2%にする必要があります)

これは、変更ハンドラーのコードです。

        final ValueChangeHandler<Boolean> booleanChangeHandler = new ValueChangeHandler<Boolean>()
        {
            @Override
            public void onValueChange(final ValueChangeEvent<Boolean> event)
            {
               Boolean value = event.getValue();
               changeAnsweredQuestionTotal(String.valueOf(value));  
            }                
        };  

そして、これはプログレスバーを変更します。また、テキストボックスが入力されているかどうかを確認するためにも使用します。

public void changeAnsweredQuestionTotal(String value)
{
    //Window.alert(value);
    boolean isEmpty = (value == null) || value.equalsIgnoreCase("Null") ? true : value.isEmpty();
    Integer answered;
    Integer totalQuestions;

    String text = this.getQuestionsAnswered().getText().substring(0, 2);
    text= text.replaceAll("\\s+", "");  

    answered = text.isEmpty() ? 0 : Integer.valueOf(text);
    answered = (answered < 0) ? 0 : answered;
    totalQuestions = this.getTotalQuestions().getValue().isEmpty() ? 0 : Integer.valueOf(this.getTotalQuestions().getValue());

    String result;

    if (isEmpty)
    {
        answered = answered - 1;
        answered = (answered < 0) ? 0 : answered;
        result = answered + " questions answered. ";
    }
    else
    {
        if (!value.equalsIgnoreCase("null"))
        {      
            answered = answered > totalQuestions ? totalQuestions : answered + 1;
        }
        result = answered + " questions answered. "; 
    }

    Integer percent = (answered*100)/totalQuestions;
    percent = (percent > 100) ? 100 : percent;
}

どんな助けでも大歓迎です。

4

1 に答える 1

1

まず、メソッド「changeAnsweredQuestionTotal」が複雑すぎるため、将来使用する場合はリファクタリングする必要があると思います。

以下に、私がそれを解決する方法を説明します。きっと他の方法もあると思います。

Map<String,Integer>アイデアは、答えのカウンター (場合は a ) を持つことです。キーはコントロール名です (例: question1 または question2 ...)。値は、回答があるかどうかに応じて 0 または 1 になります。

ValueChangeHandlerリストウィジェットごとにカスタムが必要です。このハンドラーは「ソース」(カウンターのキーとして使用される) を認識し、値に応じてカウンターを更新することを認識します。

最後に、もう 1 つのハンドラーと 1 つのインスタンスを作成し、すべてのリスト ウィジェットに割り当てて進行状況バーを更新します。

カスタム ハンドラのコードは次のとおりです。

public class QuestionChangeHandler<T> implements ValueChangeHandler<T>{

  private String source;

  private Map<String, Integer> counter;

  public QuestionChangeHandler(String source, Map<String, Integer> counter) {
    super();
    this.source = source;
    this.counter = counter;
  }



  @Override
  public void onValueChange(ValueChangeEvent<T> event) {
    T value = event.getValue();
    if (value == null) {
      counter.put(source, Integer.valueOf(0));
    } else {
      counter.put(source, Integer.valueOf(1));
    }
  }


  /**
   * @return the source
   */
  public String getSource() {
    return source;
  }

}

これは、2 つのリストを持つ小さな作業アプリです。

public class AnswersApp implements EntryPoint {

  private VerticalPanel mainPanel = new VerticalPanel();
  private Label answersLabel = new Label("Answers");
  private Label answerNumber = new Label("0");

  private ValueListBox<Boolean> question1 = new ValueListBox<Boolean>(new BooleanRenderer(), new BooleanKeyProvider());
  private ValueListBox<Boolean> question2 = new ValueListBox<Boolean>(new BooleanRenderer(), new BooleanKeyProvider());

  private ValueChangeHandler<Boolean> updateHandler;

  private HashMap<String, Integer> counter = new HashMap<String, Integer>();

  public void onModuleLoad() {
    initUpdateHandler();
    List<Boolean> values = new ArrayList<Boolean>();
    values.add(Boolean.TRUE);
    values.add(Boolean.FALSE);
    question1.setAcceptableValues(values);
    question2.setAcceptableValues(values);
    question1.addValueChangeHandler(new QuestionChangeHandler<Boolean>("q1", counter));
    question2.addValueChangeHandler(new QuestionChangeHandler<Boolean>("q2", counter));

    question1.addValueChangeHandler(updateHandler);
    question2.addValueChangeHandler(updateHandler);

    mainPanel.add(question1);
    mainPanel.add(question2);
    mainPanel.add(answersLabel);
    mainPanel.add(answerNumber);

    RootPanel.get().add(mainPanel);
  }


  private void initUpdateHandler() {
    updateHandler = new ValueChangeHandler<Boolean>() {

      @Override
      public void onValueChange(ValueChangeEvent<Boolean> event) {
        recalculateAnswers();

      }
    };

  }

  private void recalculateAnswers() {
    Set<String> keys = counter.keySet();
    int answers = 0;
    for (String key : keys) {
      Integer value = counter.get(key);
      if (value != null && value.intValue() == 1) {
        answers++;
      }
    }
    answerNumber.setText(Integer.toString(answers));
  }
}

ここで結果が回答の数です。そこから続行できると確信しています。

于 2012-04-03T21:38:36.377 に答える