2012-10-31 10 views
6

mam widżet ankietę z wyborów RadioButton i głosów LabelGWT RadioButton Zmień Handler

  1. Gdy użytkownik wybierze wyboru głosów wybór powinien +1;
  2. Po wybraniu innego wyboru, stare głosy wyborcze powinny wynosić -1, a głosy nowego wyboru +1.

użyłem ValueChangeHandler na to:

valueRadioButton.addValueChangeHandler(new ValueChangeHandler<Boolean>() { 
      @Override 
      public void onValueChange(ValueChangeEvent<Boolean> e) { 
       if(e.getValue() == true) 
       { 
        System.out.println("select"); 
        votesPlusDelta(votesLabel, +1); 
       } 
       else 
       { 
        System.out.println("deselect"); 
        votesPlusDelta(votesLabel, -1); 
       } 
      } 
     }); 

private void votesPlusDelta(Label votesLabel, int delta) 
{ 
    int votes = Integer.parseInt(votesLabel.getText()); 
    votes = votes + delta; 
    votesLabel.setText(votes+""); 
} 

Gdy użytkownik wybierze nowego wyboru, starszy słuchacz wybór powinien wskoczyć else, ale to nie będzie (tylko +1 część działa). Co powinienem zrobić?

Odpowiedz

9

mówi w RadioButton javadoc że nie otrzyma ValueChangeEvent po wyczyszczeniu przycisku opcji. Niestety oznacza to, że sam będziesz musiał prowadzić całą księgowość.

Jako alternatywny do tworzenia własnej klasy RadioButtonGroup jako sugerowane na emisyjnej trackera GWT, można rozważyć robi coś takiego:

private int lastChoice = -1; 
private Map<Integer, Integer> votes = new HashMap<Integer, Integer>(); 
// Make sure to initialize the map with whatever you need 

Wtedy, kiedy zainicjować przycisków radiowych:

List<RadioButton> allRadioButtons = new ArrayList<RadioButton>(); 

// Add all radio buttons to list here 

for (RadioButton radioButton : allRadioButtons) { 
    radioButton.addValueChangeHandler(new ValueChangeHandler<Boolean>() { 
      @Override 
      public void onValueChange(ValueChangeEvent<Boolean> e) { 
       updateVotes(allRadioButtons.indexOf(radioButton)); 
     }); 
} 

Sposób updateVotes wtedy wyglądać tak:

private void updateVotes(int choice) { 
    if (votes.containsKey(lastChoice)) { 
     votes.put(lastChoice, votes.get(lastChoice) - 1); 
    } 

    votes.put(choice, votes.get(choice) + 1); 
    lastChoice = choice; 

    // Update labels using the votes map here 
} 

Niezbyt elegancki, ale powinien wykonać to zadanie.

+0

Dzięki, myślę, że to działa! ;) – united

2

Występuje otwarta wada tego konkretnego problemu na GWT issue tracker. Ostatni komentarz zawiera sugestię, w zasadzie wydaje się, trzeba mieć changehandlers na wszystkich radiobuttons i śledzić samemu ugrupowań ...

Wiwaty,

+1

Problem został przeniesiony do github: https://github.com/gwtproject/gwt/issues/3467 –