扩展类或实例化时的Java,StackOverflowError

时间:2017-02-02 20:48:34

标签: java swing stack-overflow

好的,首先,我知道为什么我收到了这个错误,但是不知道如何解决它。

我有几个类,一个主类,一个布局类和一个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,但这也不起作用。

1 个答案:

答案 0 :(得分:2)

public class WerpButton extends Layout

因此,您创建了一个新的WerpButton(),基本上称为new Layout()

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

再次调用new WerpButton ...并且循环重复

为什么ActionListener的名称是什么 - " Button"? (当然,除非在按钮类本身上实现)。

换句话说,为什么在Layout上实现ActionListener?

您的意思是扩展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);
        }
    }