popuppanel出现在小部件下方

时间:2012-04-09 03:36:32

标签: gwt dom uibinder

我是GWT和网络新手。

我正在制作自己的项目 http://code.google.com/p/cloud-tasks-io/source/browse/#svn%2Ftrunk%2FCloudTasks-AppEngine%2Fsrc%2Fcom%2Fcloudtasks%2Fclient

我正在尝试使用弹出/对话框。弹出窗口和对话框始终显示在窗口小部件后面。我一直在谷歌搜索,我找到的最相关的是这个 http://groups.google.com/group/gwt-google-apis/browse_thread/thread/40db4fcbe10d2060没有提供任何答案。无论如何,我有第三方库,bst-player 1.3,它使用flash。所以我禁用它(后来也将其删除),弹出窗口就不会出现!它仍然隐藏在小部件后面。

我了解到popuppanel / dialogpanel相似do not need to get added to another widget。另一种说法是,它不是一个普通的小部件,在某种意义上它不能附加到父级,但它会将自己附加到dom上以保证在顶部(来自GWT composite widget

我在我的机智结束,我在这里... ...

更新

这是我的Popup类

public class PopUp {
    static PopupPanel simplePopup;

    public static void init() {
        simplePopup = new PopupPanel(true);
        simplePopup.hide();
        simplePopup.setVisible(false);

 //       DOM.setIntStyleAttribute(simplePopup.getElement(), "zIndex", 3);
    }

    public static void showpopupmsg(String msg, int left, int top) {
        if (simplePopup == null) {
            init();
        }
        if (msg != null && !msg.equalsIgnoreCase("")) {
            simplePopup.ensureDebugId("cwBasicPopup-simplePopup");
            simplePopup.setWidget(new HTML(msg));
            simplePopup.setVisible(true);
            simplePopup.setPopupPosition(left, top);
            simplePopup.setWidth("475px");  //575
            simplePopup.setGlassEnabled(true);
            simplePopup.show(); 
        }
    }

    public static void show(String message){
        if (simplePopup == null) {
            init();
        }
        simplePopup.setGlassEnabled(true);
        simplePopup.setTitle(message);
        simplePopup.center();
    }
}

以下是我打电话的方式

tasksTable.doneColumn.setFieldUpdater(new FieldUpdater<TaskProxy, Boolean>() {
  public void update(int index, TaskProxy task, Boolean value) {

      String msg = "Here is the popup. All the way underneath";
      Widget source = tasksTable;
      int left = source.getAbsoluteLeft() - 50;
      // source.getAbsoluteLeft() + 25;
      int top = source.getAbsoluteTop() - 25;
      PopUp.showpopupmsg(msg, left, top);       //Here is the calling method

    TaskRequest request = requestFactory.taskRequest();
    TaskProxy updatedTask = request.edit(task);
    updatedTask.setDone(value);
    request.updateTask(updatedTask).fire();

  }
});

以下是Popup 小部件的方式。 enter image description here

4 个答案:

答案 0 :(得分:3)

由于我还是网络应用的新手,问题的根源一直很难以实现,但是,我终于自己解决了这个问题。罪魁祸首是CSS。它将整个事物的z-index定义为相当高,如下面的代码行1333所示。

http://code.google.com/p/cloud-tasks-io/source/browse/trunk/CloudTasks-AppEngine/war/CloudTasks.css#1333

我之前对z-index表示怀疑并尝试使用微不足道的值3,如所讨论的Popup类的注释掉的代码段所示。我必须取消注释并将其设置为101。

DOM.setIntStyleAttribute(simplePopup.getElement(), "zIndex", 101);

我知道,#$%#@#$ *。

答案 1 :(得分:1)

z-index仅决定哪个小部件应显示在顶部.. 小部件弹出窗口在benath下可能有z-index值高。

为弹出通过css设置z-index(推荐)或DOM将为你工作

答案 2 :(得分:0)

根据我的感觉,使用“PopUp”对象的静态方法有点奇怪...... 通过这种方式,我认为事物相对于顶部而不是调用者对象。

也许你可以考虑让你的班级'Popup'扩展'popupanel' 在你的调用代码中,只需制作

new PopUp(msg,left,top).show() ;

答案 3 :(得分:0)

我最近为弹出式面板编写了自己的解决方案,需要与其调用者对齐。该解决方案由PopupPanel扩展和Button扩展组成。

按钮扩展名有一个面板扩展名实例,点击它的时候它会给它的面板提供坐标,宽度和高度。

            @Override
            public void onClick(ClickEvent event) {
                if (optionsPanel.isShowing()) {
                    optionsPanel.hide();
                } else {
                    optionsPanel.setButtonBounds(new Bbox(
                            getAbsoluteLeft(), getAbsoluteTop(), getOffsetWidth(), getOffsetHeight()));
                    optionsPanel.show();
                }
            }

(Bbox类只是一个我可以用来包装坐标的便利类;编写你自己的类或4个方法)

然后在PopupPanel的 onLoad()覆盖中完成主要工作,其中按钮的坐标用于定位面板;

    @Override
    protected void onLoad() {
        super.onLoad();
        if (null == bounds) {
            super.hide();
        } else {
            left = (int) bounds.getX();
            top = (int) bounds.getMaxY();
            setPopupPosition(left, top);
        }
    }

(界限是按钮的坐标; getMaxY()==按钮的底部坐标)