2017-02-02 6 views
0

Итак, сначала Я знаю, почему Я получаю эту ошибку, но просто не могу ее решить.Java, StackOverflowError при расширении класса или создании экземпляра

У меня есть пара классов, основной класс, класс макета и класс buttonClick.

Проблема в классе buttonClick: у меня есть некоторые переменные в моем классе макета, которые я должен использовать в своем классе buttonClick.

Это мой Компоновка класс:

public class Layout extends JPanel { 
    public JButton BTN_werpen; 

    public Layout{ 
     BTN_werpen = new JButton("Werpen"); 
     BTN_werpen.setBounds(465, 10, 80, 30); 
     BTN_werpen.addActionListener(new WerpButton()); 
     P_velden.add(BTN_werpen); 
    } 

Конечно, это не полный класс, но это все, что вам нужно знать.

у меня «WerpButton» actionListner класс:

public class WerpButton extends Layout implements ActionListener { 
    BTN_werpen.setEnabled(false); 
} 

Опять же, это не все, но это уже не удается, когда я просто использовать код здесь. И я знаю, почему это не удается: это потому, что когда класс Layout расширяется, конструктор получает вызов, и он создаст новый объект, который запускает класс WerpButton, который затем вызывает класс Layout, и так далее. Он в основном становится петлей.

Теперь мой вопрос:

Как решить эту проблему?

Я пробовал много уже, как не распространяющие его, а просто использовать Layout layout = new Layout(); А затем с помощью layout.BTN_werpen в моем коде, но это не работает тоже.

+0

У вас есть круговая зависимость. Каждый подтип неявно выдает вызов конструктору родительского класса. –

+0

Да, я знаю.Но как его решить, чтобы я мог использовать 'BTN_werpen' в моем другом классе? –

ответ

2
public class WerpButton extends Layout 

Таким образом, вы создаете новый WerpButton() по существу называется new Layout()

public Layout() { 
    ... 
    BTN_werpen.addActionListener(new WerpButton()); 
    ... 
} 

Что опять называется new WerpButton ... и цикл повторяется


Почему ActionListener иметь имя anything- «Кнопка»? (если они не реализованы в самом классе кнопок, конечно).

Другими словами, почему вы применили ActionListener на Layout?

Возможно, вы имели в виду расширение JButton вместо Layout?

public class WerpButton extends JButton implements ActionListener { 
    public WerpButton() { 
     this.addActionListener(this); 
    } 

    @Override 
    public void onActionPerformed(ActionEvent e) { 
     this.setEnabled(false); 
    } 
} 

Кроме того, это не сработало бы, если у вас есть отдельный файл класс

public class WerpButton extends Layout implements ActionListener { 
    BTN_werpen.setEnabled(false); // 'BTN_werpen' can't be resolved. 
} 

Вы можете попробовать сделать это по-другому - раскладка реализует слушатель. Таким образом, вам не нужен отдельный класс для обработки событий кнопок.

public class Layout extends JPanel implements ActionListener { 
    public JButton BTN_werpen; 

    public Layout() { 
     BTN_werpen = new JButton("Werpen"); 
     BTN_werpen.setBounds(465, 10, 80, 30); 
     BTN_werpen.addActionListener(this); 
     P_velden.add(BTN_werpen); 
    } 

    @Override 
    public void onActionPerformed(ActionEvent e) { 
     if (e.getSource() == BTN_werpen) { 
      // handle click 
      BTN_werpen.setEnabled(false); 
     } 
    } 
+0

Да, я знаю. Я уже это сделал, но проблема в том, что я получаю класс с 500 строками, что мне не нравится. Класс Layout уже 281 строка, а кнопки - 80-120. Поэтому я подумал, что нужно будет иметь кнопки в отдельных классах. –

+0

Это вопрос мнения и кодовой организации. Конечно, вы можете использовать ** Button ** как отдельный класс. ActionListeners действительно не имеют смысла быть раздельными, поскольку они часто нуждаются в доступе к другим переменным класса, к которому он присоединен, от –

+0

@LuukWuijster. Ваша проблема заключается в том, что вы расширили 'Layout', когда вы, вероятно, хотели расширить JButton' –

 Смежные вопросы

  • Нет связанных вопросов^_^