Как реализовать Button ActionListener для запуска cardLayout другими классами? - PullRequest
0 голосов
/ 23 февраля 2012

Не знаю, в чем проблема? Я пытаюсь переключить два отдельных класса extends JPanel с помощью cardLayout с помощью JButton, и я не знаю, использовал ли я правильный код ... Вот мое кодирование.

CardLayoutMenu

public class CardLayoutMenu extends JFrame implements ActionListener{

    CardLayout cardLayout = new CardLayout();

    private JPanel p1 = new JPanel(cardLayout);

    final String MAIN = "MAIN";
    final String OPTION = "OPTION";

    MainPanel mainPanel = new MainPanel();
    OptionPanel optionPanel = new OptionPanel();

    private Object object;

    public CardLayoutMenu(Object object) {          
        this.object = object;
    }

    public CardLayoutMenu(){

        setLayout(new BorderLayout());
        setTitle("Card Layout Menu");
        setSize(300,300);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
        setLocationRelativeTo(null);            
        add(p1);            
        p1.add(mainPanel, MAIN);
        p1.add(optionPanel, OPTION);
    }

    public void actionPerformed(ActionEvent e){

        try{
            cardLayout.show(p1, OPTION);
        }catch(Exception ex){
            System.out.println("" + ex);
        }
    }
}

Вот моя главная панель

public class MainPanel extends JPanel{

    private JButton jbtOption = new JButton("Option");

    public MainPanel() {            
        setLayout(new FlowLayout());
        add(jbtOption);         
        jbtOption.addActionListener(new CardLayoutMenu(this));
    }
}

Тогда моя OptionPanel, используйте JButton jbtBack, чтобы вернуться на MainPanel

public class OptionPanel extends JPanel{

    private JButton jbtBack = new JButton("Back");

    public OptionPanel() {          
        setLayout(new FlowLayout());
        add(jbtBack);           
    }
}

1 Ответ

3 голосов
/ 23 февраля 2012

Этот код будет вызывать бесконечную рекурсию:

public MainPanel() {
  setLayout(new FlowLayout());
  add(jbtOption);
  jbtOption.addActionListener(new CardLayoutMenu(this));
}

Поскольку этот конструктор в конечном счете вызывается из класса CardLayoutMenu, у вас будет объект CardLayoutMenu, который создает объект MainPanel, который создает объект CardLayoutMenu, которыйсоздает объект MainPanel, который создает объект CardLayoutMenu, который создает объект MainPanel, который создает ... ну, я думаю, что вы получите изображение.

Одно из основных правил, которое я настоятельно призываю вас, - не заставлять ваши классы GUI реализовывать интерфейсы Listener, так как он просит класс делать слишком много и часто приводит к запутанному коду, такому как ваш.Это нормально для небольших примеров программ, но я бы хотел, чтобы они не использовались, так как это побуждает новичков продолжать делать подобные вещи.Вместо этого подумайте о создании объекта ActionListener и передайте этот слушатель любому классу, которому нужна кнопка, которая должна сообщить CardLayout об изменении представлений.Вы можете передать этот слушатель в эти классы через параметр метода конструктора или метода установки.

...