代码之家  ›  专栏  ›  技术社区  ›  antony.trupe

gwt小部件-互斥切换按钮

  •  5
  • antony.trupe  · 技术社区  · 17 年前

    ToggleButton RadioButton . 已经有了吗?

    6 回复  |  直到 16 年前
        1
  •  9
  •   David    15 年前

    这样做的好处是,单击按钮时,面板本身会触发ClickEvents。通过这种方式,您可以向ToggleGroupPanel添加一个ClickHandler,然后使用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);
                }
            };
        }
    
    }
    
        2
  •  3
  •   kirushik    16 年前

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

    当然,对于带有变体的gwt ToggleButton(向上悬停等),需要css样式

        3
  •  3
  •   Stealth Rabbi    13 年前

    我有一些东西既不在扩展库中,也不像其他答案那样依赖于面板。定义这个管理按钮的类。我们正在向按钮添加一个新的单击侦听器,它是在“GUI内容”类中附加的任何单击处理程序之外添加的。我不能复制和粘贴这个,所以希望它在语法上是正确的。

        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);       
           }
    
       }
    
      }
    
        4
  •  1
  •   user2219808 eatonphil    12 年前

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

    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 );
            }
        }
    }
    
        5
  •  0
  •   antony.trupe    16 年前

    gwt-ext toggleButtons

    此示例演示了切换按钮。单击时,此类按钮将切换其“按下”状态。

    粗体、斜体和下划线切换按钮根据其切换状态独立运行,而文本对齐图标按钮属于同一切换组,因此当单击其中一个按钮时,先前按下的按钮将返回其正常状态。”

        6
  •  0
  •   miguelt    13 年前

    例如,切换按钮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);
            }
    }
    

    推荐文章