Desidero un ibrido di ToggleButton e RadioButton. Voglio la parte "mutuamente esclusiva" di RadioButton, e l'aspetto e il comportamento dell'interfaccia di ToggleButton (stati su e giù). Esiste già?widget gwt - pulsante di commutazione mutuamente esclusivo
risposta
Ho adattato kirushik di soluzione e creato un semplice widget "ToggleButtonPanel" che accetta un numero arbitrario di ToggleButtons (e probabilmente qualsiasi altro widget che desideri aggiungere) e un pannello a tua scelta (predefinito per VerticalPanel) e rende i pulsanti reciprocamente esclusivi.
Ciò che è bello è che il pannello stesso attiva ClickEvents quando si fa clic sui pulsanti. In questo modo, è possibile aggiungere un singolo clickHandler al ToggleGroupPanel e quindi determinare quale pulsante è stato fatto clic con evento.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);
}
};
}
}
"Questo esempio illustra pulsanti di commutazione. Quando cliccato, tali bottoni a commutazione allo stato 'premuto'.
Il grassetto, corsivo e sottolineato bottoni a commutazione funzionano in modo indipendente rispetto al loro stato ginocchiera mentre la icona di allineamento del testo I pulsanti appartengono allo stesso gruppo di commutazione e quindi quando uno di essi è cliccato, il pulsante premuto in precedenza ritorna allo stato normale. "
Qui è la mia variante pura-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);
}
}
Sicuramente, one'll bisogno di stili CSS per GWT-ToggleButton con varianti (up-bilico etc.)
Non ricordo perché volevo questo, ma +1 per la risposta. –
Grazie, non è un grosso problema - questa è solo una copia del mio attuale progetto :) – kirushik
ho qualcosa che sia non in una biblioteca di estensione, e non dipende da un pannello come le altre risposte. Definisci questa classe che gestisce i pulsanti. Stiamo aggiungendo un nuovo listener di clic ai pulsanti, che si aggiunge a qualsiasi altro gestore di clic che hai allegato nella classe "Contenuto GUI". Non riesco a copiare e incollare questo, quindi spero che sia sinteticamente corretto.
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);
}
}
}
Registrare un ClickHandler aggiuntivo su tutti i ToggleButton. Ad esempio, 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);
}
}
Naturalmente, basta aggiungere tutti gli altri codice standard e registrare ClickHandlers aggiuntivi per ogni ToggleButton.
Mi sono imbattuto lo stesso bisogno, ecco un'altra soluzione che elimina il gestore separato e funziona bene in UIBinder con una dichiarazione del tipo:
<my:RadioToggleButton buttonGroup="btnGroup" text="Button 1" />
Ecco la classe estesa:
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);
}
}
}
- 1. Come definire un gruppo mutuamente esclusivo di due argomenti posizionali?
- 2. Pulsante di commutazione AngularJS
- 3. Pulsante di commutazione multistato
- 4. Pulsante di commutazione come stile pulsante radio
- 5. GWT altezza widget personalizzati
- 6. Pulsante di collegamento GWT
- 7. Pulsante di commutazione nel cassetto di navigazione
- 8. Come posso creare un pulsante di commutazione in javafx?
- 9. Utilizzo di widget Vaadin in un'applicazione GWT
- 10. Immagine nel pulsante GWT
- 11. GWT 2.1 Data Presentation Widget senza paging
- 12. Aggiungi un widget (pulsante) a un'area di testo HTML5 in GWT
- 13. Override overflow per gwt DockLayoutPanel widget
- 14. Estendi il widget GWT creato utilizzando UIBinder
- 15. GWT back browser del pulsante
- 16. Python argparse: Mutually gruppo esclusivo con alcuni argomenti compatibili
- 17. Scala - mutuamente esclusivi tratti
- 18. Pulsante di commutazione - disabilita la funzione di scorrimento
- 19. Come posso impostare l'id per i widget GWT in UiBinder?
- 20. Perché il WPF pulsante di commutazione impulso incontrollato una volta
- 21. Rimozione del padding dal pulsante di commutazione in Android
- 22. Esempio di istruzioni di commutazione
- 23. Nome file esclusivo NSFileManager
- 24. UTI iOS esclusivo
- 25. bit esclusivo in Oracle
- 26. Modifica dello stato del pulsante di commutazione da un altro pulsante
- 27. Come registrare l'elemento HTML personalizzato come widget in GWT
- 28. click listener su widget Android Pulsante
- 29. Come posso sostituire un widget GWT in un pannello?
- 30. Raggruppamento pulsanti di commutazione Silverlight
Ma quelli non hanno la proprietà di esclusione reciproca dei pulsanti di opzione (ad esempio, fai clic su uno di essi, quindi fai clic su un altro e hai due pulsanti selezionati). –