Попытка создать нажимаемую кнопку, но при компиляции выдается ошибка - PullRequest
1 голос
/ 09 апреля 2011

CountingNumbers не является абстрактным и не перекрывает абстрактный метод actionPerformed (java.awt.event.ActionEvent) в java.awt.event.ActionListener

это ошибка, которую я получаю.

Мой код:

//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 ]

4 голосов
/ 09 апреля 2011

Когда класс реализует интерфейс, он должен реализовывать методы этого интерфейса в точности так, как они определены в интерфейсе .Ваш класс реализует ActionListener, и хотя да, у него есть метод actionPerformed, сигнатура метода не совсем соответствует сигнатуре интерфейса, так как предполагается, что этот метод должен иметь только один параметр, параметр ActionEvent, а ваш метод имеет 2,Параметр ActionEvent и параметр JFrame.Поскольку это меняет метод, компилятор будет жаловаться, что вы не реализуете все методы интерфейса.

Некоторые предложения:

  • Избавьтесь отПараметр JFrame в вашем методе actionPerformed (см. Ниже), чтобы подпись вашего метода actionPerformed соответствовала сигнатуре интерфейса.
  • Создайте переменную JFrame, создайте рамку для поля класса, чтобы оно было видно по всему классу.Таким образом, ваш метод actionPerformed не нуждается в параметре.
  • Не повторно объявляйте JFrame в вашем методе count (или конструкторе класса), но вместо этого используйте поле класса (см. Ниже).
  • Не заставляйте свой класс расширять JFrame, поскольку он не ведет себя как JFrame.
  • Исправьте форматирование кода, особенно сделав отступы соответствующими стандартам.Это значительно облегчит вам и нам понимание вашего кода и лучшую возможность его отладки.
  • Кроме того, не добавляйте JTextField в графический интерфейс каждый раз, когда нажимаете кнопку, так как я сильно сомневаюсь, что это то, что вы хотите сделать ... добавьте несколько JTextFields, если кнопка нажимается несколько раз.
  • Скорее вы захотите сделать выходной JTextField полем класса, чтобы он тоже был виден во всем приложении, вы захотите добавить его в свой JFrame или в контейнер, удерживаемый JFrame вв то же время, когда вы добавляете другие компоненты в графический интерфейс.Затем вы можете просто установить текст JTextField из метода actionPerformed, а не создавать новое поле.

Так что не это:

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 голос
/ 09 апреля 2011

Судно на воздушной подушке верно, но я просто хотел добавить, что вы, возможно, имели в виду это:

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.(Как уже было сказано)

...