扩展类时出错

时间:2014-10-12 23:21:47

标签: java extend

我对Java很新,所以我不知道出了什么问题。我在这里有一个代码,当它被执行时,应该“打开”一个窗口,但每当我在ColoredWordsExperiment类中扩展类ButtonHandler时,窗口会无限地快速打开,几乎导致我的电脑每次都崩溃。如果我省略扩展然后它工作正常,但是我将无法使用ColoredWordsExperimentButtonHandler类中的对象...下面你可以找到代码(我留下一些不重要的东西,否则它会变得太长。)

public class ColoredWordsExperiment {
    JFrame frame;
    ButtonHandler buttonHandler;

ColoredWordsExperiment(){
    frame = new JFrame("Colored Words Experiment");
    frame.setSize(1200, 150);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    button1 = new JButton("Matching");

    label1 = new JLabel("test");
    label1.setPreferredSize(new Dimension(90, 40));

    JPanel labelContainer = new JPanel();
    labelContainer.add(label1);

    JPanel buttonContainer = new JPanel();
    buttonContainer.add(button1);

    frame.add(buttonContainer, BorderLayout.SOUTH);
    frame.add(labelContainer, BorderLayout.NORTH);

    buttonHandler = new ButtonHandler();
    button1.addActionListener(buttonHandler);
}

public static void main(String[] arg) {
     new ColoredWordsExperiment();
}

}

-

public class ButtonHandler extends ColoredWordsExperiment implements ActionListener {
@Override
public void actionPerformed(ActionEvent e){
    if (e.getActionCommand().equals("Matching")) {
        System.out.println("Matching");
        label1.setText("Text changed");
    }
}
}

4 个答案:

答案 0 :(得分:2)

在这种情况下,没有理由延长ColoredWordsExperiment。您应该只是实施ActionListener

您实际上只需使用一个附加方法在其自身内初始化ColoredWordsExperiment的另一个实例。这会导致再次调用构造函数,从而导致重新创建GUI窗口 有关详细信息,请参阅Inheritance

如果您想要从ColoredWordsExperiment实施中更改ActionListener中的字段,则您希望在构建期间传递引用。

public class ButtonHandler implements ActionListener {
    ColoredWordsExperiment coloredWords;
    public ButtonHandler(ColoredWordsExperiment coloredWords) {
        this.coloredWords = coloredWords;
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getActionCommand().equals("Matching")) {
            System.out.println("Matching");
            coloredWords.label1.setText("Text changed");
        }
    }
}

在这种情况下,您还可以选择创建匿名内部类。使用这种技术,您可以完全摆脱ButtonHandler类 在ColoredWordsExperiment内而不是

buttonHandler = new ButtonHandler();
button1.addActionListener(buttonHandler);

您可以使用

button1.addActionListener(new ActionListener() {
    if (e.getActionCommand().equals("Matching")) {
        System.out.println("Matching");
        label1.setText("Text changed");
    }
});

请参阅Anonymous Classes

答案 1 :(得分:1)

在父类的构造函数中,您正在创建其中一个ButtonHandler,而这些ButtonHandler又会再次运行构造函数代码。 您不应该在构造函数中实例化此类(或者如果您尝试使用具有相同名称的名称,则使用其他名称)

答案 2 :(得分:0)

好的,我可以看到旅行问题是什么。现在我不知道你为什么要扩展它,我只是想回答你的问题(b / c没有必要将动作监听器扩展到你的主类)。当你定义类方法时你没有公开,然后当你在main方法下运行它时,它可能会混淆并制作无限帧。您应该将其更改为:

public class ColoredWordsExperiment {
    JFrame frame;
    ButtonHandler buttonHandler;

   public ColoredWordsExperiment(){//add the public!
    frame = new JFrame("Colored Words Experiment");
    frame.setSize(1200, 150);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    button1 = new JButton("Matching");

    label1 = new JLabel("test");
    label1.setPreferredSize(new Dimension(90, 40));

    JPanel labelContainer = new JPanel();
    labelContainer.add(label1);

    JPanel buttonContainer = new JPanel();
    buttonContainer.add(button1);

    frame.add(buttonContainer, BorderLayout.SOUTH);
    frame.add(labelContainer, BorderLayout.NORTH);

    buttonHandler = new ButtonHandler();
    button1.addActionListener(buttonHandler);
   }

   public static void main(String[] arg) {
       new ColoredWordsExperiment();
    }

}

此外,在您的Main类中将buttonHandler变量定义为ButtonHandler类并将ButtonHandler类扩展到Main类之外并不是一个好主意。这可能会导致循环。你不应该扩展你的第二堂课或以不同的方式定义你的buttonHandler变量。

答案 3 :(得分:0)

听起来您需要阅读并理解对象之间的区别。为了帮助您,我想用一个简单的例子说明您最初考虑代码的方式的问题:

class A {
    int x;
    B b = new B();
}

class B extends A {
}

class Main {
    public static void main(String args[]) {
        A a = new A();
        a.x = 42;
        a.b.x = 53;

        System.out.println(a.x);
        System.out.println(a.b.x);
    }
}

正如预期的那样,a中的对象main()有一个名为x的字段,我们可以将其设置为42.但是{{1}内的对象b }} 自己的字段名为a与对象x内的字段x完全无关

如果你能理解对象的概念,那么你将很快成为一名优秀的Java程序员。