2010-04-13 19 views
6

Come si imposta lo stato attivo su un componente con Apache Wicket? La ricerca porta a pochissime informazioni, principalmente sull'impostazione del campo predefinito. Non voglio impostare un campo predefinito, ma sto cercando di mettere a fuoco quando, per esempio, viene selezionato un pulsante radio specifico.Imposta lo stato attivo su un componente con Apache Wicket?

risposta

8

Dopo aver creato il comportamento per impostare lo stato attivo, dovresti essere in grado di aggiungerlo al componente in qualsiasi evento, ma assicurati che quel componente sia parte di AjaxRequestTarget. Non vedo perché questo non avrebbe funzionato ...

myRadioButton.add(new AjaxEventBehavior("onchange") { 
@Override 
protected void onEvent(AjaxRequestTarget target) { 
    myOtherComponent.add(new DefaultFocusBehavior()); 
     target.addComponent(myForm); 
} 
}); 

Ecco un link che mostra come creare il comportamento attivo predefinito se non ne hai già uno: http://javathoughts.capesugarbird.com/2009/01/wicket-and-default-focus-behavior.html

+0

io suggerirei di copiare il codice in risposta (mantenendo il riferimento originale, ovviamente), in modo che esso non dipende da risorse esterne. – tetsuo

+0

problema con questa soluzione è che una volta collegato, ogni volta che viene aggiornato (AjaxRequestTarget # addComponent) è focalizzato (o almeno focus javascript viene valutato) utilizzando AjaxRequestTarget # focusComponent è one shot focus quindi è più adatto per il comportamento richiesto in domanda ("il pulsante di opzione è selezionato") –

3

Se solo desidera setFocus tramite javascript e non desidera ricaricare un modulo o di un componente, è possibile utilizzare il seguente codice:

import org.apache.wicket.Component; 

public class JavascriptUtils { 
    private JavascriptUtils() { 

    } 

    public static String getFocusScript(Component component) { 
     return "document.getElementById('" + component.getMarkupId() + "').focus();"; 
    } 
} 

e poi in ogni metodo Ajax è possibile utilizzare:

target.appendJavascript(JavascriptUtils.getFocusScript(componentToFocus)); 
0

C'è un modo per ottenere lo stesso senza JavaScript?

(I sono l'attuazione di un modulo con una valutazione del pannello che viene solo quando Javascript è disattivato, per cui non avrebbe senso dipendere JavaScript lì ..., -)

ho potuto trovare solo risposte che usano JS .focs() ... forse Wicket 1.5 fornirà un metodo Component.setFocus() ...

+3

Non è possibile impostare lo stato attivo su un elemento html senza utilizzare JavaScript. HTML non ha un tag o un attributo che consentirebbe questo (ancora). Se Wicket avesse mai implementato un metodo Component.setFocus(), avrebbe comunque generato JavaScript per abilitarlo. – Marcelo

+1

È possibile utilizzare l'attributo html semplice "autofocus". Puoi aggiungerlo direttamente al primo tag di input dell'html o aggiungere dinamicamente "component.add (new AttributeAppender (" autofocus "," "));" Controlla la mia breve risposta. – BlondCode

0

Se ti capita di usare un pulsante Ajax, puoi semplicemente chiamare target.focusComponent(myComponent); nel metodo onSubmit del pulsante .

16

Suggerisco di utilizzare il numero nativo org.apache.wicket.ajax.AjaxRequestTarget#focusComponent(). Per esempio:

/** 
* Sets the focus in the browser to the given component. The markup id must be set. If    
* the component is null the focus will not be set to any component. 
* 
* @param component 
*   The component to get the focus or null. 
*/ 
org.apache.wicket.ajax.AjaxRequestTarget#focusComponent(Component component) 
+0

Ascolta cosa dice martin-g ;-) – Jesse

0

Per un pop-up come finestra modale mia soluzione soluzione era quella di utilizzare l'attributo "autofocus" sul primo tag input. Una soluzione semplice è aggiungerla direttamente all'html.

<input ..... autofocus> 

Un'altra soluzione è quella di aggiungerlo alla finestra modale in sé:

@Override 
public void show(AjaxRequestTarget target) { 
    super.show(target); 
    setUpFocus(); 
} 

protected void setUpFocus() { 
    DeepChildFirstVisitor visitor = new DeepChildFirstVisitor() { 

     @Override 
     public void component(Component component, IVisit<Void> iVisit) { 
      if (isAutofocusable(component)) { 
       component.add(new AttributeAppender("autofocus", "")); 
       iVisit.stop(); 
      } 
     } 

     @Override 
     public boolean preCheck(Component component) { 
      return false; 
     } 
    }; 
    this.visitChildren(FormComponent.class, visitor); 
} 

    protected boolean isAutofocusable(Component component) { 
     if (component instanceof TextArea || 
       component instanceof DropDownChoice || 
//    component instanceof RadioChoice || 
       component instanceof AjaxCheckBox || 
       component instanceof AjaxButton || 
       component instanceof TextField) { 
      return true; 
     } 
     return false; 
    } 

RadioChoice è commentata perché questa soluzione non sta lavorando su questo. Per RadioChoice Vorrei raccomandare a implementare un FocusedRadioChoice:

public class FocusedRadioChoice<T> extends RadioChoice<T> { 
//constructors... 
    @Override 
    protected IValueMap getAdditionalAttributes(int index, T choice) { 
     super.getAdditionalAttributes(0, choice); 
     AttributeMap am = new AttributeMap(); 
     am.put("autofocus", ""); 
     return am; 
    } 
} 
Problemi correlati