Этот код будет вызывать бесконечную рекурсию:
public MainPanel() {
setLayout(new FlowLayout());
add(jbtOption);
jbtOption.addActionListener(new CardLayoutMenu(this));
}
Поскольку этот конструктор в конечном счете вызывается из класса CardLayoutMenu, у вас будет объект CardLayoutMenu, который создает объект MainPanel, который создает объект CardLayoutMenu, которыйсоздает объект MainPanel, который создает объект CardLayoutMenu, который создает объект MainPanel, который создает ... ну, я думаю, что вы получите изображение.
Одно из основных правил, которое я настоятельно призываю вас, - не заставлять ваши классы GUI реализовывать интерфейсы Listener, так как он просит класс делать слишком много и часто приводит к запутанному коду, такому как ваш.Это нормально для небольших примеров программ, но я бы хотел, чтобы они не использовались, так как это побуждает новичков продолжать делать подобные вещи.Вместо этого подумайте о создании объекта ActionListener и передайте этот слушатель любому классу, которому нужна кнопка, которая должна сообщить CardLayout об изменении представлений.Вы можете передать этот слушатель в эти классы через параметр метода конструктора или метода установки.