Кнопка J не переходит к следующей карте

#java #swing #jpanel #layout-manager #cardlayout

Вопрос:

Мне нужно переключаться между несколькими панелями с помощью кнопки J, первая панель работает правильно, однако кнопка не переключается на другие панели.Это основной класс с выводом карт и кнопкой для переключения панелей с помощью CardLayout.next();. Я не совсем уверен, что делать дальше.

 public class MainPanel{
    /**
     * @param args the command line arguments
     */
    private static JFrame  frame;
    private static JButton button;
    private static JPanel cards;
    private static int panelChanger = 0;
    public static void main(String args[]){

        frame = new JFrame ("Draw");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        LinearPanel panel = new LinearPanel();
        frame.getContentPane().add(panel);

        CirclePanel panel2 = new CirclePanel();
        frame.getContentPane().add(panel2);

        AbsPanel panel3 = new AbsPanel();
        frame.getContentPane().add(panel3);

        JPanel cards = new JPanel(new CardLayout());
        cards.add(panel, "LinearPanel");
        cards.add(panel2, "CirclePanel");
        cards.add(panel3, "AbsPanel");

        button = new JButton("Next");
        button.setForeground(Color.white);
        button.setBounds(250,10,100,60);

        button.addActionListener( new ButtonListener());
        frame.add(button);

        frame.getContentPane().add(cards);
        frame.pack();
        frame.setVisible(true);
        int a = 0;

        CardLayout cardLayout = (CardLayout) cards.getLayout();
       
    }
    static class ButtonListener implements ActionListener{
       
        
        public void actionPerformed (ActionEvent event){
            if(event.getSource() == button){
                CardLayout cardLayout = (CardLayout) cards.getLayout();
                cardLayout.next(cards);
             
               
                frame.revalidate();
            }
        }
    }
}
 

Комментарии:

1. Вероятно, вы хотели задать свое cards поле, но JPanel cards = new JPanel(new CardLayout()); объявляете совершенно новую переменную с тем же именем, поэтому ваше cards поле по-прежнему равно нулю.

2. Почему вы добавляете панели как в панель содержимого frame.getContentPane().add(panel); , так и в панель JPanel карт cards.add(panel, "LinearPanel"); ? Используйте либо одно, либо другое. Я не рекомендую использовать панель содержимого напрямую, но если вы это сделаете, то убедитесь, что вы установили макет на макет карты. Возможно, полезно: docs.oracle.com/javase/tutorial/uiswing/layout/card.html

3. Забыл добавить, но он переключает панели в основном методе, но у него начались проблемы, когда мы ввели actionlistener.

4. @VGR Я обнаружил, что в консоли был java.lang. Исключение NullPointerException. Я не слишком уверен, что такое поле карт, можете ли вы объяснить более подробно.

5. Спасибо всем вам за помощь, я исправил код. Возникла проблема с Cardlayout CardLayout = (CardLayout) cards.getLayout();, его нужно было объявить в конструкторе и сделать так, чтобы он был CardLayout = (CardLayout) cards.getLayout();.