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