#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.html3. Забыл добавить, но он переключает панели в основном методе, но у него начались проблемы, когда мы ввели actionlistener.
4. @VGR Я обнаружил, что в консоли был java.lang. Исключение NullPointerException. Я не слишком уверен, что такое поле карт, можете ли вы объяснить более подробно.
5. Спасибо всем вам за помощь, я исправил код. Возникла проблема с Cardlayout CardLayout = (CardLayout) cards.getLayout();, его нужно было объявить в конструкторе и сделать так, чтобы он был CardLayout = (CardLayout) cards.getLayout();.