Изменить родительский макет дочерней кнопкой на этом макете - PullRequest
0 голосов
/ 12 апреля 2011

У меня проблема с изменением макета панели вкладок по событию щелчка на кнопке, расположенной на этой панели. Основная идея заключается в том, чтобы на каждой панели вкладок было маленькое меню (new, open, del). При нажатии кнопки макет панели вкладок меняется на форму (например). Я не хочу использовать модальное окно или новое окно, просто измените компоновку панели вкладок (содержимое) на что-то другое нажатием кнопки.

1 Ответ

1 голос
/ 12 апреля 2011

Это, неправильно заданный вопрос - вы должны спросить, как уведомить родительский компонент. Ниже у вас есть два примера, показывающих, как достичь ваших целей. Эта первая реализация делает то, что предлагает Jens Janssons на форуме vaadin, вы передаете ClickListener на вторую панель в качестве параметра конструктора. Обратите внимание, что для того, чтобы удалить компонент с внешней панели, вам нужна ссылка как на внешнюю панель, так и на внутреннюю панель. В этом примере Ким Лаппанен хранил ссылки в переменных класса. Обратите внимание, что на самом деле используется HorizontalLayout для того, что вы называете своей «панелью», вы можете изменить его.

public class TestcaseApplication extends Application implements ClickListener {
    private static final long serialVersionUID = 75232258896642392L;

    private final HorizontalLayout mainLayout = new HorizontalLayout();
    private final YourPanel panel = new YourPanel(this);

    @Override
    public void init() {
        setTheme("example");
        Window mainWindow = new Window("Playground Application");
        setMainWindow(mainWindow);

        mainWindow.setContent(mainLayout);

        mainLayout.addComponent(panel);
    }

    public void buttonClick(ClickEvent event) {
        mainLayout.removeComponent(panel);
    }

    public class YourPanel extends Panel {

        public YourPanel(ClickListener listener) {
            super();
            addComponent(new Button("Remove", listener));
        }
    }
}

Другой пример - реализация ClickListener непосредственно на внутренней панели. В методе buttonClick я просто вызываю getParent () (возвращает макет out), а затем удаляет себя из этого макета.

public class TestcaseApplication extends Application {
    private static final long serialVersionUID = 75232258896642392L;

    @Override
    public void init() {
        setTheme("example");
        Window mainWindow = new Window("Playground Application");
        setMainWindow(mainWindow);

        HorizontalLayout mainLayout = new HorizontalLayout();
        mainWindow.setContent(mainLayout);

        mainLayout.addComponent(new YourPanel());
    }

    public class YourPanel extends Panel implements ClickListener {

        public YourPanel() {
            super();
            addComponent(new Button("Remove", this));

        }

        public void buttonClick(ClickEvent event) {
            ((ComponentContainer) getParent()).removeComponent(this);
        }
    }

}
...