【问题标题】:Vaadin -layout resizing overlapsVaadin -layout 调整大小重叠
【发布时间】:2017-09-07 13:08:40
【问题描述】:

在尝试调整浏览器大小时,我的项目面临重叠问题。 我尝试了很多不同的变化来使其工作,但结果仍然不可接受。

调整大小之前:

ABC 包含在 VerticalLayout 中 - 我将其称为 root

现在,当我尝试调整浏览器的大小(如箭头所示)时,C 开始窃取其他组件的位置。

调整大小后:

我想要达到的效果是我的 Grid (C) 不适合我的浏览器。它不应该移动,只是隐藏 - 如下所示(绿色显示实际可见部分):

    /*ROOT class that extends VerticalLayout*/
    private void init()
    {
        super.setSizeFull();

        addA();
        addB();
        addC();
    }

    private void addA()
    {
        Label header = new Label();

        super.addComponent(header);
        super.setComponentAlignment(header, Alignment.MIDDLE_CENTER);
    }

    private void addB()
    {
        layoutB.setSizeFull();
        layoutB.setWidth("92%");
        super.addComponentsAndExpand(layoutB);
        super.setExpandRatio(layoutB, 0.3f);
        super.setComponentAlignment(layoutB, Alignment.MIDDLE_CENTER);
    }

    private void addC()
    {
        grid.setSizeFull();
        grid.setColumnReorderingAllowed(true);

        grid.setWidth("92%");
        super.addComponentsAndExpand(grid);
        super.setExpandRatio(grid, 0.6f);
        super.setComponentAlignment(grid, Alignment.BOTTOM_CENTER);
    }

如您所见,C的添加方式与B相同,但只有C在移动。提前感谢您的帮助!

我正在使用 Vaadin 8。

@编辑:

@SpringUI(path = "/ui")
public class MyUI extends UI {

@Override
protected void init(VaadinRequest request) 
{
    Workspace workspace = new Workspace();

    HorizontalLayout root = new HorizontalLayout();
    root.setSizeFull();
    root.addComponentsAndExpand(workspace);

    setContent(root);
}

public class Workspace extends Panel
{
    public Workspace()
    {
        init();
    }

    private void init()
    {
        setSizeFull();
        addStyleName(ValoTheme.PANEL_BORDERLESS);

        VerticalLayout layout = new VerticalLayout();
        // by default width 100% and height undefined in Vaadin 8
        setContent(layout);

        // component A
        Label label = new Label("Test1");
        layout.addComponent(label);

        // component B
        HorizontalLayout bar = new HorizontalLayout();
        bar.addComponents(new Label("Label 1"), new Label("Label 2"));
        layout.addComponent(bar);

        // component C
        Grid<MyBean> grid = new Grid<>(MyBean.class);
        grid.setCaption("My Grid:");
        grid.setHeight("1000px");
        //grid.setHeightByRows(50); // same as fixed height
        List<MyBean> items = new LinkedList<>();
        IntStream.range(1, 100).forEach(i -> items.add(new MyBean("Item " + i)));
        grid.setItems(items);
        layout.addComponent(grid);
    }
}

    public static class MyBean {
        private String name;
        public MyBean(String name) { this.name = name; }
        public String getName() { return name; }
        public void setName(String name) { this.name = name; }
    }

}

【问题讨论】:

  • 首先,当您不扩展 VerticalLayout 时,我不建议对其进行子类化 - 只需创建一个新实例并添加您的组件即可。您的问题应该是全尺寸的垂直布局。请尝试将其包裹在一个全尺寸的Panel 中,然后将您的垂直布局设置为全宽和未定义的高度。垂直布局中的其他组件也应该具有未定义的高度。这将使它根据需要增加高度。
  • 我试过这样做,但它的行为是相同的,无论我是否将我的 VerticalLayout 包裹在 Panel 中。我认为这个问题是在上一级初始化的,取决于HybridMenu 内容-more。如果HybridMenu 内容高度未满,它可以按我的意愿工作,但滚动面板无法正常工作。
  • 您是否在没有 HybridMenu 的情况下对其进行了测试?你能用面板发布完整的代码吗?
  • 是的,首先它没有HybridMenu。看起来上面的级别不能是全尺寸的。现在我看到了,如果 HybridLayout contentHybridLayout 都是全尺寸的 - 就会出现重叠问题。如果其中只有 1 个是 fullsized 就可以了,但是我不能滚动。

标签: java layout vaadin vaadin8


【解决方案1】:

看看这个工作示例:

@SpringUI(path = "/ui")
public class MyUI extends UI {

@Override
protected void init(VaadinRequest request) {
    Panel panel = new Panel();
    panel.addStyleName(ValoTheme.PANEL_BORDERLESS);
    panel.setSizeFull();

    VerticalLayout layout = new VerticalLayout();
    // by default width 100% and height undefined in Vaadin 8
    panel.setContent(layout);

    // component A
    Label label = new Label("Test1");
    layout.addComponent(label);

    // component B
    HorizontalLayout bar = new HorizontalLayout();
    bar.addComponents(new Label("Label 1"), new Label("Label 2"));
    layout.addComponent(bar);

    // component C
    Grid<MyBean> grid = new Grid<>(MyBean.class);
    grid.setCaption("My Grid:");
    grid.setHeight("1000px");
    //grid.setHeightByRows(50); // same as fixed height
    List<MyBean> items = new LinkedList<>();
    IntStream.range(1, 100).forEach(i -> items.add(new MyBean("Item " + i)));
    grid.setItems(items);
    layout.addComponent(grid);

    setContent(panel);
}

public static class MyBean {
    private String name;
    public MyBean(String name) { this.name = name; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
}

}

Grid 具有固定的高度(按像素或按行数)。 VerticalLayout 不需要扩展比率。 Panel 中的布局将根据其子组件的需要而增长。如果高度大于Panel 的可用空间,则显示滚动条。

【讨论】:

  • 好吧,当我这样做时它也适用于我,但是当Panel 没有直接设置为UI 内容时会出现问题。你能再试一试吗?就像将 Panel 插入到 HorizontalLayout 中一样,这是 UI 的内容。我看到我错过了这个问题,因为我确定没有连接。
  • 如果你修改我的例子并重新发布它会更容易。
  • 我试过你的代码,但我看不到任何问题。究竟是什么不工作?一个潜在的问题是HorizontalLayout 不是全高 (100%)。您可以在 Vaadin 的 client debug window 中看到这一点。
  • 是的,对不起,我忘记将HorizontalLayout 设置为全尺寸。你现在可以看到组件的重叠了吗?
  • 屏幕截图显示了您的应用程序。您是否使用我修改的示例代码重现了该问题?如果是,请为此添加屏幕截图,如果不是,我只能在您提供在我的机器上重现该问题所需的全部代码时为您提供帮助。
猜你喜欢
  • 2013-06-15
  • 1970-01-01
  • 2021-12-28
  • 1970-01-01
  • 2017-11-08
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 2014-04-24
相关资源
最近更新 更多