سؤال

وأريد هجين من <لأ href = "http://google-web-toolkit.googlecode.com/svn/javadoc/1.6/com/google/gwt/user/client/ui/ToggleButton.html" يختلط = "noreferrer"> ToggleButton و <لأ href = "http://google-web-toolkit.googlecode.com/svn/javadoc/1.6/com/google/gwt/user/client/ui/RadioButton هتمل "يختلط =" noreferrer "> زر راديو . أريد الجزء "متبادل الحصري" من زر راديو، ونظرة واجهة المستخدم الرسومية وسلوك ToggleButton (صعودا وهبوطا الدول). لا احد موجود بالفعل؟

هل كانت مفيدة؟

المحلول

ولقد تكيفت حل kirushik وخلق بسيطة "ToggleButtonPanel" القطعة التي تأخذ عدد التعسفي من ToggleButtons (وربما أي الحاجيات الأخرى التي ترغب في إضافتها) وفريق من اختيارك (الافتراضي VerticalPanel) ويجعل أزرار يستبعد بعضها بعضا.

وما لطيفة في هذا هو أن الفريق نفسه حرائق ClickEvents عندما يتم النقر على الأزرار. بهذه الطريقة، يمكنك إضافة ClickHandler واحدة إلى ToggleGroupPanel ومن ثم تحديد الزر الذي تم النقر باستخدام 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);
            }
        };
    }

}

نصائح أخرى

وهنا هو بلدي نقية GWT البديل:

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

وبالتأكيد، وأساليب الحاجة المغلق one'll لGWT-ToggleButton مع المتغيرات (-up-تحوم الخ.)

ولدي شيء في آن معا لا في مكتبة الإرشاد، ولا تعتمد على لوحة مثل إجابات أخرى. تحديد هذه الفئة التي تدير الأزرار. واضاف نحن بنقرة والمستمع الجديد إلى أزرار، والتي هي بالإضافة إلى أي معالج انقر أنت تعلق في فئة "GUI المحتوى". أنا لا يمكن نسخ ولصق هذا في، لذلك نأمل انها syntatically صحيح.

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

   }

  }

وجاء في نفس الحاجة، هيريس حل آخر أن يلغي معالج مستقل ويعمل بشكل جيد في UIBinder مع إعلان مثل:

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

GWT-تحويلة toggleButtons

و"يوضح هذا المثال أزرار تبديل، وعندما النقر عليها، هذه أزرار تبديل بتعديل صفحة 'الضغط' الدولة.

والجريء، مائل وتسطير تبديل أزرار تعمل بشكل مستقل فيما يتعلق الدولة تبديل في حين تنتمي أزرار رمز محاذاة النص إلى مجموعة تبديل ذاتها، وذلك عند واحد منهم هو نقرة، يعود زر ضغط سابقا إلى حالته الطبيعية. "

والتسجيل وClickHandler إضافية على جميع ToggleButtons. على سبيل المثال، ToggleButtons المنزل، شجرة، ملخص، والتفاصيل.

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

وبطبيعة الحال، تحتاج فقط إلى إضافة كافة التعليمات البرمجية النمطي الآخر وتسجيل ClickHandlers إضافي لكل ToggleButton.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top