У меня есть Jmix приложение, в нём есть три вкладки в приложении, и если в одной вкладке я набираю текст в поля, и перехожу в другую вкладку, приложение переоткрывает вкладку, и данные стираются. Как сделать так, чтобы при переходе в другую вкладку, вкладка не переоткрывалась, а открывалась предыдущая и данные оставались.
Добрый день!
Можете, пожалуйста, добавить чуть больше контекста и примера? По умолчанию переключаясь между вкладками внутри приложения данные остаются.
У меня есть открытая вкладка экрана, я повторно нажимаю в меню на пункт отвечающий за этот экран, экран переоткрывается. А мне нужно, чтобы ранее открытая вкладка экрана получала фокус. А уж если открытой вкладки нет, чтобы открывалась снова.
Стандартные средства не позволяют выбирать вкладку с открытым экраном по нажатию из меню. Есть возможность открывать новый, через аннотацию @MultipleOpen
(см. Аннотации контроллеров :: Документация Jmix), либо оставить дефолтное поведение.
Более сложный и не очень надёждный вариант переопределить бин MenuItemCommands
, отвечающий за нажатие по элементу меню. В нём проверять открыт ли экран, и если открыт выбрать эту вкладку.
Расширенный MenuItemCommands
@Primary
@Component("app_ExtMenuItemCommands")
public class ExtMenuItemCommands extends MenuItemCommands {
@Override
protected MenuItemCommand createScreenCommand(FrameOwner origin, MenuItem item) {
return new ExtMenuItemCommand(origin, item, item.getScreen(), item.getDescriptor());
}
protected class ExtMenuItemCommand extends ScreenCommand {
public ExtMenuItemCommand(FrameOwner origin, MenuItem item, String screen, Element descriptor) {
super(origin, item, screen, descriptor);
}
@Override
public void run() {
Screens screens = getScreenContext(origin).getScreens();
List<UiControllerProperty> controllerProperties = convertToUiControllerProperties(item.getProperties());
WindowInfo windowInfo = windowConfig.getWindowInfo(this.screen);
Screen screen = createScreen(windowInfo, this.screen, controllerProperties);
Screens.OpenedScreens openedScreens = screens.getOpenedScreens();
Screens.WindowStack windowStack = openedScreens.getWorkAreaStacks().stream()
.filter(ws -> isAlreadyOpened(screen, Iterables.getLast(ws.getBreadcrumbs())))
.findFirst()
.orElse(null);
if (windowStack != null) {
windowStack.select();
return;
}
super.run();
}
}
}