Как заставить полосу прокрутки появляться в окне с панелью неопределенного размера? - PullRequest
0 голосов
/ 29 апреля 2018

В приведенном ниже примере окно с панелью увеличивается, пока не достигнет пределов окна браузера. После этого содержимое панели становится прокручиваемым, но полоса прокрутки не появляется. Если я установлю Panel на полосу прокрутки фиксированного размера, появится в соответствии с документацией.

Может кто-нибудь предложить шаблон Vaadin для реализации полос прокрутки, когда размер окна или панели достигает предела окна браузера?

public class DemoUI extends UI {

@Override
protected void init(VaadinRequest vaadinRequest) {
    VerticalLayout layout = new VerticalLayout();
    layout.setSizeFull();
    Button demo1 = new Button("Question");
    demo1.addClickListener(new Button.ClickListener() {
        @Override
        public void buttonClick(Button.ClickEvent clickEvent) {
            Window window = new Window();
            window.setClosable(true);
            window.center();
            window.setResizable(true);
            window.setModal(false);
            window.setContent(new UndefWindow(window));

            addWindow(window);
        }
    });
    layout.addComponent(demo1);
    setContent(layout);
}
}

public class UndefWindow extends VerticalLayout {

private Window window;
public UndefWindow(Window window){
    this.window = window;
    Panel panel = new Panel();
    VerticalLayout layout = new VerticalLayout();
    Button add10 =new Button("Add 10");
    add10.addClickListener(new Button.ClickListener() {
        @Override
        public void buttonClick(Button.ClickEvent clickEvent) {
            for (int i=0; i <10; i++){
                layout.addComponent(new Label("Label: "+i));
            }
            window.center();
        }
    });
    layout.addComponent(add10);
    panel.setContent(layout);
    addComponent(panel);
    setExpandRatio(panel, 1.0f);

}
}

РЕДАКТИРОВАТЬ: мне удалось добиться этого с помощью аддона SizeReporter - код ниже

SizeReporter

public class UndefWindow extends VerticalLayout {

private Window window;
VerticalLayout root;
int rootHeight;
public UndefWindow(Window window, VerticalLayout root){
    this.window = window;
    this.root = root;

    Panel panel = new Panel();
 //   panel.setHeight("400px");

    SizeReporter sizeReporterRoot = new SizeReporter(root);
    sizeReporterRoot.addResizeListener(new ComponentResizeListener() {
        @Override
        public void sizeChanged(ComponentResizeEvent event) {
            System.out.println("Root size: " + event.getWidth() + " x " + event.getHeight());
            rootHeight = event.getHeight();
        }
    });
    SizeReporter sizeReporter = new SizeReporter(panel);
    sizeReporter.addResizeListener(new ComponentResizeListener() {
        @Override
        public void sizeChanged(ComponentResizeEvent event) {
            System.out.println("Panel size: " + event.getWidth() + " x " + event.getHeight());
            if(event.getHeight()>rootHeight){
                window.setHeight(rootHeight-60, Unit.PIXELS);
                //window.center();
                panel.setHeight(rootHeight-60, Unit.PIXELS);
            }else
                window.center();
        }
    });

    VerticalLayout layout = new VerticalLayout();

    Button add10 =new Button("Add 10");
    add10.addClickListener(new Button.ClickListener() {
        @Override
        public void buttonClick(Button.ClickEvent clickEvent) {
            for (int i=0; i <10; i++){
                layout.addComponent(new Label("Label: "+i));
            }
        }
    });
    addComponent(add10);
    panel.setContent(layout);
    addComponent(panel);

}
}

1 Ответ

0 голосов
/ 01 мая 2018

У вас немного чрезмерно сложное мышление в контенте вашего окна. В Vaadin Window сама расширяет Panel, поэтому вам вообще не нужна дополнительная Panel. Так что я убрал это. Кроме того, чтобы макеты работали должным образом, вы хотите, чтобы высота VerticalLayout была неопределенной, то есть увеличивалась до тех пор, пока не будет достигнут размер окна браузера. Чтобы прокрутка Panel работала в этом сценарии, должно быть некоторое содержимое определенной высоты, в данном случае это метка, поэтому я установил для определенной высоты метку. Затем при добавлении меток будет добавлен размер VerticalLayout, и как только высота браузера превысит, Panel получит полосы прокрутки.

public class MyUI extends UI {

    @Override
    protected void init(VaadinRequest vaadinRequest) {
        VerticalLayout layout = new VerticalLayout();
        layout.setSizeFull();
        Button demo1 = new Button("Question");
        demo1.addClickListener(new Button.ClickListener() {
            @Override
            public void buttonClick(Button.ClickEvent clickEvent) {
                Window window = new Window("Window");
                window.setClosable(true);
                window.center();
                window.setResizable(true);
                window.setModal(false);
                window.setContent(new UndefWindow(window));

                addWindow(window);
            }
        });
        layout.addComponent(demo1);
        setContent(layout);
    }

    public class UndefWindow extends VerticalLayout {
        private Window window;
        public UndefWindow(Window window){
            this.window = window;
            Button add10 =new Button("Add 10");
            add10.addClickListener(new Button.ClickListener() {
                @Override
                public void buttonClick(Button.ClickEvent clickEvent) {
                    for (int i=0; i <10; i++){
                        Label label = new Label("Label: "+i);
                        label.setHeight("38px");    
                        addComponent(label);
                    }
                    window.center();
                }
            });
            addComponent(add10);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...