代码之家  ›  专栏  ›  技术社区  ›  Yuval

可以自定义窗口吗?

  •  5
  • Yuval  · 技术社区  · 15 年前

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

    4 回复  |  直到 10 年前
        1
  •  3
  •   Alexey Sviridov    15 年前

    根据/org/apache/wicket/extension/ajax/markup/html/modal/res/modal.js,不能通过wicket api修改modal window decorator,因为modal window markup完全由javascript定义。因此,您可以选择简单但不好的方法,并用自己的方法替换modal.js,或者在使用js对span进行类“w_CaptionText”修改后,您也很难真正地更改modal window。 或者可能是(我没有测试它),您可以在caption属性中定义自定义代码,并告诉wicket不要转义这个标题中的特殊HTML字符。也许会有帮助。

        2
  •  6
  •   Ru5    14 年前

    你可以在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/custommodalwindow.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>
    

    你需要的一切:

    /组织/ru5/test/res/custom-modal.css

    .headBtn{position: absolute; z-index: 20001; top: 2px; left: 200px;}
    

    /org/ru5/test/testpanelfortestwindow.html

    ....
    <div class="headBtn">
    <input type="button" value="ok">
    </div>
    ....
    

    您可以尝试重写modal.js函数,或者在JS DOM的帮助下进行一个技巧。 希望这会有所帮助。

        3
  •  2
  •   equinox    14 年前

    有点像黑客,但有效:

    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();
      }
    
    }
    
        4
  •  1
  •   Gytis    10 年前

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

    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"//
                        + "}"//
                );
            }
    }
    

    实际上,您可以从模式窗口插入任何类,并以某种方式对其进行更改。 希望它能帮助别人:)