Вместо того, чтобы поменять местами реальные окна на экране, я предлагаю вам иметь одно основное приложение JFrame и поменять JPanels, которые оно отображает, в зависимости от состояния приложения. Это больше соответствует большинству профессиональных приложений, которые мы используем, включая текстовые процессоры и IDE, и будет казаться пользователю более естественным. Чтобы достичь этого в Java, изучите, как ваш контейнер (обычно JPanel, содержащий другие JPanel и компоненты) использует CardLayout. Затем вы рассматриваете JPanels как карты и меняете их с помощью методов макета. Исключением является случай, когда вам нужно диалоговое окно поверх основного графического интерфейса, и это можно сделать, просто используя один из методов JOptionPane, или более подробно, создав и используя модальный или немодальный JDialog. 1001 *
Ссылка на учебное пособие по CardLayout