2012-10-31 43 views
6

Tôi có một widget cuộc bình chọn với lựa chọn RadioButton và Label phiếuGWT RadioButton Change Handler

  1. Khi người dùng chọn một lựa chọn, sự lựa chọn phiếu nên 1;
  2. Khi lựa chọn khác được chọn, phiếu bầu chọn cũ nên -1 và phiếu bầu chọn mới sẽ +1.

tôi đã sử dụng ValueChangeHandler cho việc này:

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+""); 
} 

Khi người dùng chọn lựa chọn mới, người nghe lựa chọn lớn tuổi nên nhảy vào tuyên bố khác, nhưng nó sẽ không (Chỉ 1 công trình phần). Tôi nên làm gì?

Trả lời

9

Nó nói trong RadioButton javadoc rằng bạn sẽ không nhận được một ValueChangeEvent khi một nút radio bị xóa. Thật không may, điều này có nghĩa là bạn sẽ phải tự mình làm tất cả các sổ sách kế toán.

Là một phai lạt để tạo lớp RadioButtonGroup của riêng bạn như đề xuất về vấn đề theo dõi GWT, bạn có thể xem xét việc làm một cái gì đó như thế này:

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

Sau đó, khi bạn khởi tạo các nút radio:

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)); 
     }); 
} 

Phương thức updateVotes trông giống như sau:

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 
} 

Không phải là rất thanh lịch, nhưng nó nên làm công việc.

+0

Cảm ơn, tôi nghĩ nó hoạt động! ;) – united

2

Có lỗi mở đối với vấn đề cụ thể này tại số GWT issue tracker. Bình luận cuối cùng có một gợi ý, về cơ bản nó xuất hiện bạn cần phải có changehandlers trên tất cả các radiobutton và theo dõi các nhóm chính mình ...

Chúc mừng,

+1

Vấn đề đã được chuyển sang github: https://github.com/gwtproject/gwt/issues/3467 –