2013-04-28 2 views
0

Я получаю java.lang.StackOverflowError когда я запускаю этот код:Добавление ActionListener в течение цикла бросает StackOverflowError

Map<JButton, Integer> buttons = new HashMap<JButton, Integer>(); 
JPanel main = new JPanel(new GridLayout(4, 4, 4, 4)); 

    for(int i = 0; i < 16; i++) { 
     JButton jb = new JButton(i+""); 
     jb.addActionListener(new MyActionListener()); 
     switch(i) { 
     case 0: 
      jb.setText("1"); 
     case 1: 
      jb.setText("2"); 
     case 2: 
      jb.setText("3"); 
     (...) 
     case 15: 
      jb.setText("/"); 
     } 
     buttons.put(jb, i); 
     main.add(jb); 
    } 

    this.getContentPane().add(main); 

Почему происходит эта ошибка? И как я могу это исправить? Благодарю.

+1

Возможно, вы получаете бесконечный цикл при добавлении прослушивателя действий, уверены ли вы, что ваш код «MyActionListener» прав? можете ли вы опубликовать полную статистику стека, а также полный код? – BackSlash

+0

Также он всегда будет устанавливать текст в «/». Вы забыли добавить «break» в ваши дела. –

+1

Чтобы лучше помочь, опубликуйте [SSCCE] (http://sscce.org/). –

ответ

0

Хорошо, я понял. Проблема заключалась в использовании внешнего класса MyActionListener. Мне пришлось создать void actionPerformed() в классе, где я создаю новые JButtons, а также добавлю implements ActionListener.

В любом случае спасибо за ответы.

0

Решение 1:

case 1: 
     jb.setText("2"); 
    **break** 

Попробуйте поставить перерыв после случаев переключения. Я предлагаю вам также использовать «по умолчанию» в конце случаев коммутатора.

Решение 2: Пожалуйста, проверьте, если у вас есть какие-то бесконечные рекурсивные функции, такие как

public void foo(){ 
    foo(); //never stops 
} 

Для получения дополнительной информации о StackOverflow ошибке What is a StackOverflowError?

+0

Я очень сомневаюсь в этом ответе. Ваша репутация 'не найдена'! :) –