Java Wicket模式窗口可以定制吗?

Java Wicket模式窗口可以定制吗?,java,customization,wicket,titlebar,Java,Customization,Wicket,Titlebar,我需要在Wicket模式窗口的标题栏中添加一个按钮。我在Wicket API中找不到任何有用的东西来帮助我。有没有办法用这种方式自定义标题栏?根据/org/apache/wicket/extension/ajax/markup/html/modal/res/modal.js您不能通过wicket api修改模态窗口装饰器,因为模态窗口标记完全是用javascript定义的。所以,像往常一样,您可以选择简单但不好的方式,并用自己的方式替换modal.js,或者您很难在show之后使用js使用类“w

我需要在Wicket模式窗口的标题栏中添加一个按钮。我在Wicket API中找不到任何有用的东西来帮助我。有没有办法用这种方式自定义标题栏?

根据/org/apache/wicket/extension/ajax/markup/html/modal/res/modal.js您不能通过wicket api修改模态窗口装饰器,因为模态窗口标记完全是用javascript定义的。所以,像往常一样,您可以选择简单但不好的方式,并用自己的方式替换modal.js,或者您很难在show之后使用js使用类“w_captionText”修改span来更改模态窗口。
或者(我不是在测试它)您可以在标题属性中定义自定义代码,并告诉wicket不要在这个标题中转义特殊的html字符。可能会有帮助。

您可以借助CSS实现这种效果。 创建自定义模式窗口(以防不创建自定义样式)并指定css资源

package org.ru5.test;

import org.apache.wicket.ResourceReference;
import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
import org.apache.wicket.markup.html.CSSPackageResource;
import org.apache.wicket.markup.html.resources.CompressedResourceReference;
import org.apache.wicket.model.IModel;

public class CustomModalWindow extends ModalWindow {
    private static final long serialVersionUID = 1L;

    private static ResourceReference CSS = new CompressedResourceReference(
            CustomModalWindow.class, "res/custom-modal.css");

    /**
     * Creates a new modal window component.
     * 
     * @param id
     *            Id of component
     */
    public CustomModalWindow(final String id) {
        super(id);
        init();
    }

    /**
     * Creates a new modal window component.
     * 
     * @param id
     *            Id of component
     * @param model
     *            Model
     */
    public CustomModalWindow(final String id, final IModel<?> model) {
        super(id, model);
        init();
    }

    private void init() {
        add(CSSPackageResource.getHeaderContribution(CSS));
    }

}
/org/ru5/test/TestPanelForTestWindow.html

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
<body><wicket:panel><div wicket:id="content"></div></wicket:panel></body>
</html>
....
<div class="headBtn">
<input type="button" value="ok">
</div>
....
。。。。
....
您可以尝试重写modal.js函数,或者在js DOM的帮助下玩个小把戏。
希望这会有所帮助。

有点小技巧,但有效:

import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
import org.apache.wicket.model.IModel;

public class FixedModalWindow extends ModalWindow {
  private static final long serialVersionUID = 1L;

  public FixedModalWindow(String id) {
    super(id);
    setResizable(false);
  }

  public FixedModalWindow(String id, IModel<?> model) {
    super(id, model);
    setResizable(false);
  }

  @Override
  public FixedModalWindow setResizable(boolean resizable) {
    // Cannot set resizable on the FixedModalWindow
    return this;
  }

  @Override
  public boolean isResizable() {
    return false;
  }

  @Override
  protected Object getShowJavascript()
  {
    // Hack in some JS to remove the onMove handlers
    StringBuffer showJS = new StringBuffer();
    showJS.append(" ");
    showJS.append((String) super.getShowJavascript());
    showJS.append("var popupWindow = Wicket.Window.get();\n");
    showJS.append("var nullHandler = function() {};\n");
    showJS.append("if(popupWindow != null) {\n");
    showJS.append("popupWindow.bind(popupWindow.caption, nullHandler);\n");
    showJS.append("popupWindow.bind(popupWindow.bottomRight, nullHandler);\n");
    showJS.append("popupWindow.bind(popupWindow.bottomLeft, nullHandler);\n");
    showJS.append("popupWindow.bind(popupWindow.bottom, nullHandler);\n");
    showJS.append("popupWindow.bind(popupWindow.left, nullHandler);\n");
    showJS.append("popupWindow.bind(popupWindow.right, nullHandler);\n");
    showJS.append("popupWindow.bind(popupWindow.topLeft, nullHandler);\n");
    showJS.append("popupWindow.bind(popupWindow.topRight, nullHandler);\n");
    showJS.append("popupWindow.bind(popupWindow.top, nullHandler);\n");
    showJS.append("}\n");
    return showJS.toString();
  }

}
import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
导入org.apache.wicket.model.IModel;
公共类FixedModalWindow扩展了ModalWindow{
私有静态最终长serialVersionUID=1L;
公共FixedModalWindow(字符串id){
超级(id);
可设置大小(假);
}
公共FixedModalWindow(字符串id,IModel模型){
超级(id,型号);
可设置大小(假);
}
@凌驾
public FixedModalWindow可设置大小(布尔值可调整大小){
//无法在FixedModalWindow上设置可调整大小
归还这个;
}
@凌驾
公共布尔值IsResizeable(){
返回false;
}
@凌驾
受保护对象getShowJavascript()
{
//黑客在一些JS删除onMove处理程序
StringBuffer showJS=新的StringBuffer();
showJS.append(“”);
append((字符串)super.getShowJavascript());
showJS.append(“var popupWindow=Wicket.Window.get();\n”);
append(“var nullHandler=function(){};\n”);
append(“if(popupWindow!=null){\n”);
showJS.append(“popupWindow.bind(popupWindow.caption,nullHandler);\n”);
showJS.append(“popupWindow.bind(popupWindow.bottomRight,nullHandler);\n”);
showJS.append(“popupWindow.bind(popupWindow.bottomLeft,nullHandler);\n”);
showJS.append(“popupWindow.bind(popupWindow.bottom,nullHandler);\n”);
showJS.append(“popupWindow.bind(popupWindow.left,nullHandler);\n”);
showJS.append(“popupWindow.bind(popupWindow.right,nullHandler);\n”);
showJS.append(“popupWindow.bind(popupWindow.topLeft,nullHandler);\n”);
showJS.append(“popupWindow.bind(popupWindow.topRight,nullHandler);\n”);
showJS.append(“popupWindow.bind(popupWindow.top,nullHandler);\n”);
showJS.append(“}\n”);
返回showJS.toString();
}
}

如何在wicket的模式窗口中隐藏关闭按钮? 我们找到了这样一个解决方案:

ModalWindow yourModal = new ModalWindow("yourModalID") {
        @Override
        public void show(AjaxRequestTarget pTarget) {
            super.show(pTarget);

            pTarget.appendJavascript(""//
                    + "var thisWindow = Wicket.Window.get();\n"//
                    + "if (thisWindow) {\n"//
                    + "$('.w_close').attr('style', 'display:none;');\n"//
                    + "}"//
            );
        }
}
实际上,您可以从模式窗口插入任何类,并以某种方式对其进行更改。
希望它能帮助别人:)

如果你走简单的路。您将如何覆盖modal.js?
ModalWindow yourModal = new ModalWindow("yourModalID") {
        @Override
        public void show(AjaxRequestTarget pTarget) {
            super.show(pTarget);

            pTarget.appendJavascript(""//
                    + "var thisWindow = Wicket.Window.get();\n"//
                    + "if (thisWindow) {\n"//
                    + "$('.w_close').attr('style', 'display:none;');\n"//
                    + "}"//
            );
        }
}