我正在创建一项调查供用户填写,其中一项要求是实现一个进度条,该进度条会在用户回答问题时填充。
我无法完全理解的错误是列表框。如果我选择一个值,计数器就会上升,但如果我选择另一个值,计数器会再次增加,而它应该保持相同的值。
下面的基本示例:
- 选择值
- 正确
- 错误
完成百分比:0%(默认下拉列表,“选择值”作为默认值)
- 正确
- 选择值
- 错误
完成百分比:2%
- 错误
- 选择值
- 正确
完成百分比: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;
}
任何帮助将不胜感激。
最佳答案
首先,我认为您的方法“changeAnsweredQuestionTotal”过于复杂,如果您决定将来使用它,则需要重构。
下面我将描述如何解决它。我确信还有其他方法。
这个想法是为答案设置一个计数器(在本例中为 Map<String,Integer>
)。键是控件名称(例如 Question1 或 Question2 ...),值可以是 0 或 1,具体取决于是否回答。
您应该有一个自定义 ValueChangeHandler
对于每个列表小部件。该处理程序将知道“源”(将用作计数器中的键),并且知道根据值更新计数器。
最后,您再创建一个处理程序、一个实例,并分配给所有列表小部件以更新进度栏。
这是自定义处理程序的代码:
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;
}
}
这是一个带有两个列表的小型工作应用程序:
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));
}
}
这里的结果是答案的数量,我相信您可以从那里继续。
关于java - 检查 GWT 中是否回答了 ValueListBoxes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10000564/