CountingNumbers不是抽象的,并且不会覆盖java.awt.event.ActionListener中的抽象方法actionPerformed(java.awt.event.ActionEvent)
是我得到的错误。
我的代码:
//Create an application that counts the number of each letter in a given word/phrase
//have a box that has a text box a button and output box
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class CountingNumbers extends JFrame implements ActionListener
{
public void count()
{
JFrame frame = new JFrame("Counting Letters Application");
JTextField textEntry = new JTextField("enter your word/phrase here", 1);
JButton count = new JButton("Count Letters");
count.addActionListener(this);
frame.setPreferredSize(new Dimension(400, 300));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Color teal = new Color(0, 128, 128);
frame.getContentPane().setBackground(teal);
frame.getContentPane().add(textEntry, BorderLayout.NORTH);
frame.getContentPane().add(count, BorderLayout.EAST);
frame.pack();
frame.setVisible(true);
}
public void actionPerformed(ActionEvent e, JFrame frame)
{
JTextField output = new JTextField("output box", 4);
frame.getContentPane().add(output, BorderLayout.WEST);
output.setText("button was clicked");
}
}
我不知道为什么会这样,我对java很新,只是从我学校的一门课上学到的。
答案 0 :(得分:4)
当一个类实现一个接口时,它必须完全按照接口中的定义实现该接口的方法。你的类实现了ActionListener,而且它有一个actionPerformed方法,方法签名与接口的方法签名不完全匹配,因为这个方法应该只有一个参数,ActionEvent参数,你的方法有2个, ActionEvent参数和JFrame参数。由于这会改变方法,编译器会抱怨你没有实现接口的所有方法。
一些建议:
所以不是这个:
public void actionPerformed(ActionEvent e, JFrame frame)
但是这个:
public void actionPerformed(ActionEvent e)
而不是这个:
public class CountingNumbers extends JFrame implements ActionListener {
public void count() {
JFrame frame = new JFrame("Counting Letters Application");
JTextField textEntry = new JTextField("enter your word/phrase here", 1);
但是这个
public class CountingNumbers implements ActionListener {
private JFrame frame = new JFrame("Counting Letters Application");
private JTextField outputField = new JTextField(10);
public void count() {
JTextField textEntry = new JTextField("enter your word/phrase here", 1);
// add your outputField to the GUI from somewhere in this method
稍后我们可以讨论为什么让你的GUI类实现一个监听器接口通常是一个坏主意,但让我们不要一次性地用太多的改变和建议来压倒你。 :)
答案 1 :(得分:1)
气垫船是正确的,但我只是想补充说你可能有这个意思:
public void actionPerformed(ActionEvent e)
{
JTextField output = new JTextField("output box", 4);
this.getContentPane().add(output, BorderLayout.WEST);
output.setText("button was clicked");
}
由于你的“CountingNumbers”类扩展了JFrame,它本身实际上是一个JFrame。这就是你可以调用“this.getContentPane()”而不是“frame.getContentPane()”的原因。但是,如果您希望“CountingNumbers”对象继续向自身添加文本字段,则情况就是如此。如果要将文本字段添加到另一个帧,则必须将该帧存储为CountingNumbers的私有字段(可以在构造期间初始化):
public class CountingNumbers extends JFrame implements ActionListener
{
private JFrame frameToAddTextFieldsTo;
public CountingNumbers(JFrame frameToAddTextFieldsTo){
this.frameToAddTextFieldsTo = frameToAddTextFiedsTo;
}
public void count()
{
JFrame frame = new JFrame("Counting Letters Application");
JTextField textEntry = new JTextField("enter your word/phrase here", 1);
JButton count = new JButton("Count Letters");
count.addActionListener(this);
frame.setPreferredSize(new Dimension(400, 300));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Color teal = new Color(0, 128, 128);
frame.getContentPane().setBackground(teal);
frame.getContentPane().add(textEntry, BorderLayout.NORTH);
frame.getContentPane().add(count, BorderLayout.EAST);
frame.pack();
frame.setVisible(true);
}
public void actionPerformed(ActionEvent e)
{
JTextField output = new JTextField("output box", 4);
frameToAddTextFieldsTo.getContentPane().add(output, BorderLayout.WEST);
output.setText("button was clicked");
}
}
因为“CountingNumbers”也实现了ActionListener接口,所以它也是一个ActionListener,这意味着它需要具有ActionListener接口中定义的相同方法。 (如前所述)