2013-04-08 103 views
0

現在我的程序遇到了很大的麻煩。我不明白這個錯誤消息「MyEventA不是抽象的,也不會覆蓋java.awt.event.ActionListener中的抽象方法actionPerformed(java.awt.event.actionEvent)。」我嘗試過在網上和我的教科書上查找,但仍然無法正常工作。事件處理問題 - Java

我真的很感激,如果有人能幫我弄清楚我的代碼有什麼問題。我一直在爲此工作一個半小時,但仍然沒有解決。 :(在此先感謝!

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class MyEventA extends JFrame implements ActionListener 
{ 
    private JButton plus; 
    private JButton minus; 
    private JButton reset; 
    private JButton quit; 

    public MyEventA() 
{ 
    add(new JLabel("Current Value", JLabel.LEFT), BorderLayout.NORTH); 
    JTextField jtfCurrent = new JTextField("0"); 
    add(jtfCurrent, BorderLayout.EAST); 
    JPanel jpSouth = new JPanel(); 
    plus = new JButton("+"); 
    minus = new JButton("-"); 
    reset = new JButton("Reset"); 
    quit = new JButton("Quit"); 
    ButtonListener b1 = new ButtonListener(jtfCurrent); 
    jtfCurrent.addActionListener(b1); 
    plus.addActionListener(this); 
    minus.addActionListener(this); 
    reset.addActionListener(this); 
    quit.addActionListener(this); 
    jpSouth.add(plus); 
    jpSouth.add(minus); 
    jpSouth.add(reset); 
    jpSouth.add(quit); 
    add(jpSouth, BorderLayout.SOUTH); 
} 

class ButtonListener implements ActionListener { 
    private JTextField writeInto; // text field reference 
    private int count = 0; 

    public ButtonListener(JTextField tf) { 
     writeInto = tf; 
     count = 0; 
    } 

    public void actionPerformed(ActionEvent ae){ 
     if(ae.getActionCommand().equals("+")){ 
      count++; 
      writeInto.setText("" + count); 
     } 
     else if(ae.getActionCommand().equals("-")){ 
      count--; 
      writeInto.setText("" + count); 
     } 
     else if(ae.getActionCommand().equals("Reset")){ 
      count = 0; 
      writeInto.setText("" + count); 
     } 
     else { 
      System.exit(0);  
     } 
    } 

    public static void main(String[] args){ 
     MyEventA events = new MyEventA(); 
     events.setTitle("Part 2 Using getSource"); 
     events.pack(); 
     events.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     events.setSize(300,100); 
     events.setLocation(200,200); 
     events.setVisible(true); 
    } 
} 
} 
+3

忘記了抽象類一秒鐘,你學到了什麼什麼接口,並應該做什麼當一個類實現一個? – Perception 2013-04-08 03:53:11

+0

你知道Java中的'implements'是什麼意思嗎?以及一個類如何實現一個接口? – 2013-04-08 03:54:44

回答

2

在一般情況下,當一個(非抽象)類implements接口,合同是由這表明這一類將實現在接口提供的所有方法。

你類MyEventAimplements接口ActionListener,這需要被覆蓋的方法(void actionPerformed(ActionEvent))。由於MyEventA不是抽象的,編譯器告訴你,你需要在這裏實現的方法。

如果你是wond爲了實現這個方法,你在你的子類(ButtonListener)中有一個很好的例子。在這裏你可以看到ButtonListener實現了相同的接口ActionListener,並實現了它的方法。

+0

我該怎麼做? – 2013-04-08 03:54:29

+0

那麼爲什麼該方法不會被重寫,即使我有一個ButtonListener類可以實現它> – 2013-04-08 03:59:52

+1

類ButtonListener是與MyEventA不同的類。它是在一箇中實現的,而不是其他的。 – 2013-04-08 04:00:43

1

如果要實現ActionListener接口,則必須重寫actionPerformed(java.awt.event.ActionEvent)方法。如果未覆蓋接口中的方法,編譯器會要求將該類聲明爲abstarct。

+0

嗯,我以爲我是壓倒性的,但現在我一般都很困惑。我怎麼不壓倒它呢? – 2013-04-08 04:01:21

+0

如果您滿意,請投票。 – JRR 2013-04-08 04:11:53

1

因爲MyEventA已實施ActionListener因爲它是不是必須實現的抽象類/定義方法actionPeformed (ActionEvent)多少你已經在ButtonListener

做了同樣的方式,但我認爲你想做的事其實並不是有MyEventA實施ActionListener,而是通過一個new ButtonListener()您的按鈕像

plus.addListener (new ButtonListener()); 
1

改寫如下,它爲我工作:

import javax.swing.*; 

import java.awt.*; 
import java.awt.event.*; 

public class MyEventA extends JFrame implements ActionListener { 
    private JButton plus; 
    private JButton minus; 
    private JButton reset; 
    private JButton quit; 

    public MyEventA() { 
     add(new JLabel("Current Value", JLabel.LEFT), BorderLayout.NORTH); 
     JTextField jtfCurrent = new JTextField("0"); 
     add(jtfCurrent, BorderLayout.EAST); 
     JPanel jpSouth = new JPanel(); 
     plus = new JButton("+"); 
     minus = new JButton("-"); 
     reset = new JButton("Reset"); 
     quit = new JButton("Quit"); 
     ButtonListener b1 = new ButtonListener(jtfCurrent); 
     jtfCurrent.addActionListener(b1); 
     plus.addActionListener(this); 
     minus.addActionListener(this); 
     reset.addActionListener(this); 
     quit.addActionListener(this); 
     jpSouth.add(plus); 
     jpSouth.add(minus); 
     jpSouth.add(reset); 
     jpSouth.add(quit); 
     add(jpSouth, BorderLayout.SOUTH); 
    } 

    class ButtonListener implements ActionListener { 
     private JTextField writeInto; // text field reference 
     private int count = 0; 

     public ButtonListener(JTextField tf) { 
      writeInto = tf; 
      count = 0; 
     } 

     public void actionPerformed(ActionEvent ae) { 
      if (ae.getActionCommand().equals("+")) { 
       count++; 
       writeInto.setText("" + count); 
      } else if (ae.getActionCommand().equals("-")) { 
       count--; 
       writeInto.setText("" + count); 
      } else if (ae.getActionCommand().equals("Reset")) { 
       count = 0; 
       writeInto.setText("" + count); 
      } else { 
       System.exit(0); 
      } 
     } 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) {// was to be implemented 

     javax.swing.JOptionPane.showMessageDialog(null, "clicked"); 

    } 

    public static void main(String[] args) {// main method should be in the outer class 
     MyEventA events = new MyEventA(); 
     events.setTitle("Part 2 Using getSource"); 
     events.pack(); 
     events.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     events.setSize(300, 100); 
     events.setLocation(200, 200); 
     events.setVisible(true); 
    } 

} 

如果你想使用actionPerformedButtonListener類,使用下面的代碼:

import javax.swing.*; 

import java.awt.*; 
import java.awt.event.*; 

public class MyEventA extends JFrame implements ActionListener { 
    private JButton plus; 
    private JButton minus; 
    private JButton reset; 
    private JButton quit; 


    public MyEventA() { 
     add(new JLabel("Current Value", JLabel.LEFT), BorderLayout.NORTH); 
     JTextField jtfCurrent = new JTextField("0"); 
     add(jtfCurrent, BorderLayout.EAST); 
     JPanel jpSouth = new JPanel(); 
     plus = new JButton("+"); 
     minus = new JButton("-"); 
     reset = new JButton("Reset"); 
     quit = new JButton("Quit");  


     ButtonListener b1 = new ButtonListener(jtfCurrent); 
     jtfCurrent.addActionListener(b1); 
     plus.addActionListener(new ButtonListener(jtfCurrent)); 
     minus.addActionListener(new ButtonListener(jtfCurrent)); 
     reset.addActionListener(new ButtonListener(jtfCurrent)); 
     quit.addActionListener(new ButtonListener(jtfCurrent)); 
     jpSouth.add(plus); 
     jpSouth.add(minus); 
     jpSouth.add(reset); 
     jpSouth.add(quit); 
     add(jpSouth, BorderLayout.SOUTH); 
    } 

    class ButtonListener implements ActionListener { 
     private JTextField writeInto; // text field reference 
     private int count = 0; 
     public ButtonListener() { 

     } 
     public ButtonListener(JTextField tf) { 
      writeInto = tf; 
      count = 0; 
     } 

     public void actionPerformed(ActionEvent ae) { 
      if (ae.getActionCommand().equals("+")) { 
       count++; 
       writeInto.setText("" + count); 
      } else if (ae.getActionCommand().equals("-")) { 
       count--; 
       writeInto.setText("" + count); 
      } else if (ae.getActionCommand().equals("Reset")) { 
       count = 0; 
       writeInto.setText("" + count); 
      } else { 
       System.exit(0); 
      } 
     } 

    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 

     javax.swing.JOptionPane.showMessageDialog(null, "clicked"); 

    } 

    public static void main(String[] args) { 
     MyEventA events = new MyEventA(); 
     events.setTitle("Part 2 Using getSource"); 
     events.pack(); 
     events.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     events.setSize(300, 100); 
     events.setLocation(200, 200); 
     events.setVisible(true); 
    } 

}