尝试创建可单击的按钮但在编译时会抛出错误

时间:2011-04-09 13:28:19

标签: java swing jframe abstract jbutton

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很新,只是从我学校的一门课上学到的。

2 个答案:

答案 0 :(得分:4)

当一个类实现一个接口时,它必须完全按照接口中的定义实现该接口的方法。你的类实现了ActionListener,而且它有一个actionPerformed方法,方法签名与接口的方法签名不完全匹配,因为这个方法应该只有一个参数,ActionEvent参数,你的方法有2个, ActionEvent参数和JFrame参数。由于这会改变方法,编译器会抱怨你没有实现接口的所有方法。

一些建议:

  • 删除actionPerformed方法中的JFrame参数(见下文),以便actionPerformed方法的签名与接口的签名相匹配。
  • 制作你的JFrame变量,构建一个类字段,使其在整个类中可见。这样你的actionPerformed方法就不需要参数了。
  • 不要在count方法(或类构造函数)中重新声明JFrame,而是使用类字段(见下文)。
  • 不要让您的类扩展JFrame,因为它不像JFrame那样。
  • 修复代码格式,特别是使缩进符合标准。这将使您和我们更容易理解您的代码并更好地调试它。
  • 此外,每次按下按钮时都不要向gui添加JTextField,因为我强烈怀疑这是你想要做的...如果多次按下按钮,会添加几个JTextField。
  • 相反,你需要让输出JTextField成为一个类字段,以便它在整个应用程序中都可见,你需要将它添加到你的JFrame,或者同时将它添加到JFrame的容器中您将其他组件添加到GUI。然后,您只需在actionPerformed方法中设置JTextField的文本,而不是创建新字段。

所以不是这个:

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接口中定义的相同方法。 (如前所述)