当前位置: 首页 > 知识库问答 >
问题:

GWT/GXT容器呈现位置问题

田英卓
2023-03-14

在尝试将绝对定位的HorizontalContainer插入到其他容器中时,我遇到了一个奇怪的问题。如果兄弟姐妹仍在渲染(有一个蒙版集),这个绝对容器会按其宽度推送他的下一个兄弟姐妹。

例子:。

//parent container, holding all the widgets
HorizontalLayoutContainer hlc;

//widgets that are inserted into hlc container from the start
HBoxLayoutContainer hbox1;
HBoxLayoutContainer hbox2;
HBoxLayoutContainer hbox3;

//container that's inserted into hlc onMouseOver event. It can be inserted while hlc hboxes are still being rendered
HorizontalLayoutContainer panelContainer = new HorizontalLayoutContainer(); 
panelContainer.getElement().getStyle().setZIndex(13);
panelContainer.getElement().getStyle().setPosition(Position.ABSOLUTE);
panelContainer.getElement().getStyle().setWidth(55, Unit.PX);
panelContainer.getElement().getStyle().setHeight(18, Unit.PX);
panelContainer.getElement().getStyle().setFloat(Float.LEFT);

现在,让我们假设用户将鼠标悬停在hlc容器上,该容器具有hbox1-3,但是其中一些容器具有掩码集(数据仍在加载),例如hbox1。mask()。onMouseOver事件插入hlc:

hlc.insert(panelContainer, 0, new HorizontalLayoutData(55, 18));

然而,由于HBox仍在渲染,panelContainer将hbox1向右推55px(其长度)。即使其位置为:绝对

                left:55px; should be left: 0px;
                -->
|panleContainer|hbox1|hbox2|hbox3| 

任何建议我应该如何正确插入panelContainer?为什么忽略绝对定位?

注:

如果我等待HBox被渲染,panelContainer被正确插入,hbox1不会被推送。

避免xy问题的澄清:

简短总结:添加一个绝对定位的框(为了清楚起见,我们称之为DragBox),它具有现有容器(WidgetBox)的预定义宽度。WidgetBox是一个HorizontalLayoutContainer,它具有2或3个HBoxLayoutContainers。WidgetBox子级(HBoxLayoutContainers)具有百分比宽度。例如:如果WidgetBox有2个子级,它们的宽度分别为0.3和0.7,如果3个子级,则宽度0.3, 0.4, 0.3;

WidgetBox的大小由其父对象(SimpleContainer)决定-

期望:当鼠标悬停在任何WidgetBox容器上时,会添加一个新项目(DragBox)作为WidgetBox的第一个元素。无论如何,它不应该影响WidgetBox子元素。它应该充当绝对(在WidgetBox边界内)框。

结果:如果强制执行WidgetBox或其父布局(通过forceLayout()),则DragBox会影响第一个子WidgetBox。如果未使用forceLayout(),则DragBox不会影响WidgetBox子项。

共有1个答案

阚小云
2023-03-14

因为在我的例子中forceLayout()仅用于确保正确的WidgetBox子项(请参见我的编辑)内容格式,所以我不想强制为WidgetBox布局子项。

为了避免这种情况,我在widgetBox的每个子级而不是父级上强制布局。

例子:。

HorizontalLayoutContainer (parent) 
  -> HorizontalLayoutContainer (child 1, removed/added on mouseOver/Out)
  -> HBoxLayoutContainer (child 2)
  -> ...

我曾经强制父级布局,如parent.forceLayout(),这将强制子级布局,父容器将调整大小。

如前所述,为了避免在每个孩子身上单独强制布局:

for(int i = 0; i < parent.getWidgetCount(); i++) {
    if (parent.getWidget(i) instanceof ResizeContainer) {
        ResizeContainer widget = (ResizeContainer) parent.getWidget(i);
        widget.forceLayout();
    }
}
 类似资料:
  • 我正在使用GWT 2.4.0和GXT 3.0.0b,我试图用谷歌编译应用程序,但每次我都会遇到这个错误。 问题是什么?它是否有一些缺失的jar/插件?早些时候,我将GWT 2.1与Gxt 2.4一起使用,Gxt 2.4用于精细编译。请帮忙

  • 我看到GXT 2.3.0的jar文件名=gxt-2.3.0-gwt22.jar.这是否意味着它期待GWT 2.2??考虑到GXT 2.3.0于2013年10月发布,GWT 2.2.0于2011年2月发布(3年前),这似乎有点奇怪。我尝试了GWT 2.6.1,但在GXT jar中出现错误(HtmlEditor.java第548行:类型不匹配:无法从com.google.gwt.dom.client.

  • 我试着在GXT中制作一个表单来上传文件,但我在网上看到了更多的例子,我没能用一个简单的FileUploadField将文件保存在本地 Cde片段: 上面的代码是FormPanel和FileUploadField的声明。

  • 我想实现回收器视图布局,但我得到错误“呈现问题”。我尝试添加include,但错误仍然存在。我该如何解决问题呢? 错误:I

  • 我正在使用react、Redux和react Router开发一个react web应用程序,带有服务器端呈现(使用express) 我面临的问题有点难以解释。我将试着在下面的步骤中进行解释。 > 您首先从http://www.example.com/articles/1234这样的URL进入应用程序。express服务器将发送正确的内容,其中包括正确的页面源和DOM(来自chrome Eleme

  • 我显示的优惠券的列表基于类别选择使用使用使用效果和佐贺。 这是我的初始状态。设置为真正的默认值,以便每当组件被访问时,它首先显示加载器,之后从获得调度,它命中api并使用redux-saga异步获得响应,然后设置为false,并根据响应或得到更新。 这是一个组件: 当组件第一次被访问时,正在加载因此将变为真,并且组件呈现加载程序并请求api获取数据。 从api获取数据后,加载设置为false,组件