如何使用Apache Wicket设置对组件的关注?搜索导致的信息非常少,主要是设置默认字段。我不想设置默认字段,而是在设置焦点时,例如,选择特定的单选按钮。
答案 0 :(得分:17)
我建议使用原生org.apache.wicket.ajax.AjaxRequestTarget#focusComponent()
。例如:
/**
* 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)
答案 1 :(得分:8)
创建行为以设置焦点后,您应该能够在任何事件上将其添加到组件,只需确保该组件是AjaxRequestTarget的一部分。我不明白为什么这不起作用......
myRadioButton.add(new AjaxEventBehavior("onchange") {
@Override
protected void onEvent(AjaxRequestTarget target) {
myOtherComponent.add(new DefaultFocusBehavior());
target.addComponent(myForm);
}
});
这是一个链接,显示如果您还没有创建默认焦点行为的方法: http://javathoughts.capesugarbird.com/2009/01/wicket-and-default-focus-behavior.html
答案 2 :(得分:3)
如果您只想通过javascript设置setFocus并且不想重新加载表单或组件,则可以使用以下代码:
import org.apache.wicket.Component;
public class JavascriptUtils {
private JavascriptUtils() {
}
public static String getFocusScript(Component component) {
return "document.getElementById('" + component.getMarkupId() + "').focus();";
}
}
然后在任何Ajax方法中你都可以使用:
target.appendJavascript(JavascriptUtils.getFocusScript(componentToFocus));
答案 3 :(得分:0)
有没有办法实现相同的没有 JavaScript?
(我正在实现一个带有反馈面板的表单,只有当Javascript关闭时才出现,所以依赖于那里的JavaScript是没有意义的......, - )
我只能找到使用JS .focs()的答案......也许Wicket 1.5会提供一个方法Component.setFocus()......
答案 4 :(得分:0)
如果您正在使用Ajax按钮,只需在按钮的target.focusComponent(myComponent);
方法中调用onSubmit
即可。
答案 5 :(得分:0)
对于弹出窗口,例如modalWindow ,我的解决方法解决方案是在第一个输入标记上使用属性“autofocus”。 一个简单的解决方案是直接将其添加到html中。
<input ..... autofocus>
另一种解决方案是将其添加到modalWindow本身:
@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已被注释掉,因为此解决方案无法解决此问题。对于RadioChoice,我建议实现一个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;
}
}
答案 6 :(得分:0)
@ martin-g的解决方案是使它适用于我的方案的唯一解决方案-模态/弹出窗口。
注意: 我认为显式嵌入HTML的自动对焦仅适用于页面加载,而不适用于模式加载,因此,任何熟练地在模式的HTML中设置自动对焦属性的努力都会失败-总是失败。
在这里,我列出了使用Wicket的全部功能(没有JS!)将焦点设置在名为“ myInput”的输入字段上的步骤:
在onInitialize中:
// Make sure the field has an ID in markup
myInput.setOutoutMarkupId(true);
提供一个覆盖的show方法,您可以在其中调用focusComponent方法:
public void show(AjaxRequestTarget target)
{
// Make sure you call the super method first!
super.show(target);
target.focusComponent(myInput);
}
这确实要求您的组件是模态内容类的属性,以便您可以在show方法中访问它。为避免为输入组件创建类属性,您可以通过替换解决方案的
将此解决方案与BlondCode的解决方案混合component.add(new AttributeAppender("autofocus", ""));
与
target.focusComponent(component);
这也可以!