#jakarta-ee #vaadin
#джакарта-ee #vaadin
Вопрос:
У меня проблема с изменением макета панели вкладок с помощью события click на buton, расположенном на этой панели. Основная идея состоит в том, чтобы иметь пользовательское меню (создать, открыть, удалить) на небольшой панели на каждой панели вкладок. При нажатии кнопки макет панели вкладок изменяется на форму (например). Я не хочу использовать модальное окно или новое окно, просто измените макет панели вкладок (содержимое) на что-то другое нажатием кнопки.
Ответ №1:
Это неправильно указанный вопрос — вы должны спросить, как уведомить родительский компонент. Ниже приведены два примера, показывающие, как достичь ваших целей. Эта первая реализация делает то, что предлагает Йенс Янссонс на форуме 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() (возвращает исходящий макет), а затем удаляет себя из этого макета.
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);
}
}
}