2017-02-02 10 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); 
} 

、これがすべてではないが、私はちょうどここにコードを使用するときには、すでに失敗します。なぜそれが失敗するのか分かります。レイアウトクラスが拡張されると、コンストラクタが呼び出され、WerpButtonクラスをトリガする新しいオブジェクトが作成され、レイアウトクラスが呼び出されるなどです。それは基本的にループになります。

私の質問は次のとおりです。

この問題を解決するにはどうすればよいですか?

は、私は私のコードでlayout.BTN_werpenを使用して、それを拡張するが、ちょうどLayout layout = new Layout(); を使用しないように、たくさんすでに を試みたが、それはあまりにも動作しません。

+0

循環依存関係があります。各サブタイプは、親クラスのコンストラクタを暗黙的に呼び出します。 –

+0

はい、私は知っています。しかし、他のクラスで 'BTN_werpen'を使用できるように、どうすれば解決できますか? –

答えて

2
public class WerpButton extends Layout 

だから、あなたは再びnew WerpButtonと呼ばれる基本的new Layout()

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

と呼ばれる新しいWerpButton()を作成...とループは

たActionListenerが名前anything-を持っていないのはなぜ

を繰り返し、 "ボタン"? (もちろんボタンクラス自体に実装されていない限り)。

つまり、なぜLayoutにActionListenerを実装しましたか?

Layoutの代わりにJButtonを拡張することを意味しましたか?

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行のクラスを取得することです。レイアウトクラスはすでに281行で、ボタンは80-120のようです。だから私は別のクラスでボタンを持つ必要があると思った。 –

+0

それは意見とコード構成の問題です。もちろん、別のクラスとして** Button **を持つことができます。 ActionListenersは、別のクラスにアクセスする必要があるので、実際には分離されていません –

+0

@LuukWuijster問題は、おそらく 'JButton'を拡張することを意味する' Layout'を拡張したことです –

関連する問題