GWT القطعة - زر تبديل متبادل الحصري
-
20-09-2019 - |
سؤال
وأريد هجين من <لأ 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 );
}
}
}
و"يوضح هذا المثال أزرار تبديل، وعندما النقر عليها، هذه أزرار تبديل بتعديل صفحة 'الضغط' الدولة.
والجريء، مائل وتسطير تبديل أزرار تعمل بشكل مستقل فيما يتعلق الدولة تبديل في حين تنتمي أزرار رمز محاذاة النص إلى مجموعة تبديل ذاتها، وذلك عند واحد منهم هو نقرة، يعود زر ضغط سابقا إلى حالته الطبيعية. "
والتسجيل و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.