2009-08-29 30 views

Trả lời

9

Tôi đã thích nghi kirushik của giải pháp và tạo một widget "ToggleButtonPanel" đơn giản, có một số tùy ý ToggleButtons (và có thể là bất kỳ tiện ích con nào bạn muốn thêm) và bảng điều khiển bạn chọn (mặc định là VerticalPanel) và làm cho các nút loại trừ lẫn nhau.

Điều thú vị là bảng điều khiển tự kích hoạt ClickEvents khi các nút được nhấp. Bằng cách này, bạn có thể thêm một ClickHandler duy nhất để các ToggleGroupPanel và sau đó xác định nút mà được nhấp sử dụng event.getSource()

import java.util.ArrayList; 
import java.util.Iterator; 
import java.util.List; 

import com.google.gwt.event.dom.client.ClickEvent; 
import com.google.gwt.event.dom.client.ClickHandler; 
import com.google.gwt.event.dom.client.HasClickHandlers; 
import com.google.gwt.event.shared.HandlerRegistration; 
import com.google.gwt.user.client.ui.Composite; 
import com.google.gwt.user.client.ui.HasWidgets; 
import com.google.gwt.user.client.ui.Panel; 
import com.google.gwt.user.client.ui.ToggleButton; 
import com.google.gwt.user.client.ui.VerticalPanel; 
import com.google.gwt.user.client.ui.Widget; 

public class ToggleButtonPanel extends Composite implements HasWidgets, HasClickHandlers{ 

    public ToggleButtonPanel() { 
     this(new VerticalPanel()); 
    } 

    public ToggleButtonPanel(Panel panel){ 
     this.panel = panel; 
     initWidget(panel); 
    } 

    @Override 
    public void add(Widget w) { 
     if(w instanceof ToggleButton){ 
      ToggleButton button = (ToggleButton) w; 
      button.addClickHandler(handler); 
     } 
     panel.add(w); 
    } 

    @Override 
    public void clear() { 
     panel.clear(); 
    } 

    @Override 
    public Iterator<Widget> iterator() { 
     return panel.iterator(); 
    } 

    @Override 
    public boolean remove(Widget w) { 
     return panel.remove(w); 
    } 

    @Override 
    public void setWidth(String width) { 
     panel.setWidth(width); 
    }; 

    @Override 
    public void setHeight(String height) { 
     panel.setHeight(height); 
    } 

    private final Panel panel; 
    private ClickHandler handler = new ClickHandler(){ 
     @Override 
     public void onClick(ClickEvent event) { 
      Iterator<Widget> itr = panel.iterator(); 
      while(itr.hasNext()){ 
       Widget w = itr.next(); 
       if(w instanceof ToggleButton){ 
        ToggleButton button = (ToggleButton) w; 
        button.setDown(false); 
        if(event.getSource().equals(button)) { 
         button.setDown(true); 
        } 
       } 
      } 

      for(ClickHandler h : handlers){ 
       h.onClick(event); 
      } 
     } 
    }; 

    private List<ClickHandler> handlers = new ArrayList<ClickHandler>(); 
    @Override 
    public HandlerRegistration addClickHandler(final ClickHandler handler) { 
     handlers.add(handler); 
     return new HandlerRegistration() { 

      @Override 
      public void removeHandler() { 
       handlers.remove(handler); 
      } 
     }; 
    } 

} 
0

gwt-ext toggleButtons

"Ví dụ này minh họa Chuyển đổi Buttons. Khi nhấn vào, Buttons như chuyển đổi 'ép' tình trạng của họ.

The Bold, Italic và gạch dưới Buttons chuyển đổi hoạt động độc lập liên quan đến trạng thái chuyển đổi của họ trong khi biểu tượng căn chỉnh văn bản Các nút thuộc cùng một nhóm chuyển đổi và do đó khi một trong số chúng được nhấp, nút được nhấn trước đó sẽ trở về trạng thái bình thường của nó. "

+0

Nhưng những không có thuộc tính loại trừ lẫn nhau của các nút radio (tức là bạn nhấp vào một nút, sau đó nhấp vào nút khác và bạn đã chọn hai nút). –

3

Đây là biến thể tinh khiết-gwt tôi:

class ThreeStateMachine extends FlowPanel{ 
     // This is the main part - it will unset all the buttons in parent widget 
     // and then set only clicked one. 
     // One mutual handler works faster and is generally better for code reuse 
     private final ClickHandler toggleToThis = new ClickHandler() { 
       @Override 
       public void onClick(ClickEvent clickEvent) { 
        for(Widget b: ThreeStateMachine.this.getChildren()){ 
         ((ToggleButton)b).setDown(false); 
        } 
        ((ToggleButton)clickEvent.getSource()).setDown(true); 
       } 
      }; 

     private ThreeStateMachine() { // Create out widget and populat it with buttons 
      super(); 

      ToggleButton b = new ToggleButton("one"); 
      b.setDown(true); 
      b.addClickHandler(toggleToThis); 
      this.add(b); 

      b = new ToggleButton("two"); 
      b.addClickHandler(toggleToThis); 
      this.add(b); 

      b = new ToggleButton("three"); 
      b.addClickHandler(toggleToThis); 
      this.add(b); 
     } 
    } 

Chắc chắn, one'll cần phong cách css cho gwt-ToggleButton với các biến thể (-up-lơ lửng, vv)

+0

Tôi không nhớ tại sao tôi muốn điều này, nhưng 1 cho câu trả lời. –

+0

Cảm ơn, đó không phải là một vấn đề lớn - đây chỉ là một dán từ dự án hiện tại của tôi :) – kirushik

3

tôi có cái gì đó là cả hai không trong một thư viện mở rộng, và không phụ thuộc vào một bảng điều khiển giống như các câu trả lời khác. Xác định lớp này quản lý các nút. Chúng tôi đang thêm một trình nghe nhấp chuột mới vào các nút, đó là ngoài bất kỳ trình xử lý nhấp chuột nào bạn đã đính kèm trong lớp "Nội dung GUI". Tôi không thể sao chép và dán nó vào, vì vậy hy vọng nó đúng về mặt cú pháp.

public class MutuallyExclusiveToggleButtonCollection { 

     List<ToggleButton> m_toggleButtons = new ArrayList<ToggleButton>(); 

     public void add(ToggleButton button) { 
      m_toggleButtons.add(button); 
      button.addClickListener(new ExclusiveButtonClickHandler()); 
    } 

    private class ExclusiveButtonClickHandler impelments ClickHandler { 
     public void onClick(ClickEvent event) { 
      for(ToggleButton button : m_toggleButtons) { 
      boolean isSource = event.getSource().equals(button); 
      button.setIsDown(isSource);  
     } 

    } 

    } 
0

Đăng ký một ClickHandler bổ sung trên tất cả ToggleButtons. Ví dụ: ToggleButtons home, tree, summary, detail.

public class Abc extends Composite implements ClickHandler { 
     ToggleButton home, tree, summary, detail 
     public Abc() { 
      // all your UiBinder initializations... blah, blah.... 
      home.addClickHandler(this); 
      tree.addClickHandler(this); 
      summary.addClickHandler(this); 
      detail.addClickHandler(this); 
     } 
     @Override 
     public void onClick(ClickEvent p_event) { 
      Object v_source = p_event.getSource();   
      home.setDown(home==v_source); 
      tree.setDown(tree==v_source); 
      summary.setDown(summary==v_source); 
      detail.setDown(detail==v_source); 
     } 
} 

Tất nhiên, bạn chỉ cần thêm tất cả mã boilerplate khác và đăng ký ClickHandlers bổ sung cho mỗi ToggleButton.

1

đi qua cùng một nhu cầu, heres một giải pháp mà không đi với xử lý riêng biệt và các công trình độc đáo trong UiBinder với một khai báo như sau:

<my:RadioToggleButton buttonGroup="btnGroup" text="Button 1" /> 

Đây là lớp mở rộng:

import java.util.HashMap; 

import com.google.gwt.event.dom.client.ClickEvent; 
import com.google.gwt.event.dom.client.ClickHandler; 
import com.google.gwt.uibinder.client.UiConstructor; 
import com.google.gwt.user.client.ui.ToggleButton; 

public class RadioToggleButton extends ToggleButton 
{ 
    private static HashMap<String,ButtonGroup> buttonGroups = new HashMap<>(); 
    private ButtonGroup buttonGroup; 

    public @UiConstructor RadioToggleButton(String buttonGroupName) 
    { 
     buttonGroup = buttonGroups.get(buttonGroupName); 
     if(buttonGroup == null){ 
      buttonGroups.put(buttonGroupName, buttonGroup = new ButtonGroup()); 
     } 
     buttonGroup.addButton(this); 
    } 

    @Override 
    public void setDown(boolean isDown) 
    { 
     if(isDown){ 
      RadioToggleButton btn = buttonGroup.pressedBtn; 
      if(btn != null){ 
       btn.setDown(false); 
      } 
      buttonGroup.pressedBtn = this; 
     } 
     super.setDown(isDown); 
    } 

    private class ButtonGroup implements ClickHandler 
    { 
     RadioToggleButton pressedBtn = null; 

     public void addButton(ToggleButton button) 
     { 
      button.addClickHandler(this); 
     } 

     @Override 
     public void onClick(ClickEvent event) 
     { 
      Object obj = event.getSource(); 
      if(pressedBtn != null){ 
       pressedBtn.setDown(false); 
      } 
      pressedBtn = (RadioToggleButton)obj; 
      pressedBtn.setDown(true); 
     } 
    } 
} 
Các vấn đề liên quan