2013-08-14 4 views
2

Так что я делаю этот код для записи в файл на основе пользовательских кликов. Единственная проблема, с которой я столкнулся, заключается в том, что я получаю сообщение об ошибке «public class prog». Имя prog - это то место, где я получаю сообщение об ошибке: Он говорит: Тип prog должен реализовать унаследованный абстрактный метод ActionListener.actionPerformed (ActionEvent). Когда я делаю quickfix добавления неизученных методов, он добавляет метод прослушивателя действий в конец моего кода, но в нем ничего нет. Если у меня уже есть слушатели действий в программе, почему это говорит мне, что мне нужно их реализовать? И почему, когда я добавляю его в конце, он работает нормально, хотя в нем ничего нет?Код говорит мне, что мне нужно реализовать ActionListener, когда у меня уже есть?

import java.awt.*; 
import java.awt.event.*; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 

import javax.swing.*; 

public class prog extends JFrame implements ActionListener { 

//create newLine 
final String newLine = System.getProperty("line.separator"); 

//create buttons 
JPanel row1 = new JPanel(); 
JButton oneLeft = new JButton("oneLeft"); 
JButton oneRight = new JButton("oneRight"); 

JPanel row2 = new JPanel(); 
JButton twoLeft = new JButton("twoLeft"); 
JButton twoRight = new JButton("twoRight"); 

JPanel row3 = new JPanel(); 
JButton threeLeft = new JButton("threeLeft"); 
JButton threeRight = new JButton("threeRight"); 


public prog() { 
    super("Prog"); 
    setLookAndFeel(); 
    setSize(400, 800); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    GridLayout layout = new GridLayout(3, 2); 
    setLayout(layout); 

    //create outStream for writing to file 
    try { 
     final File numClicks = new File("numClicks.properties"); 
     final FileOutputStream outStream = new FileOutputStream(numClicks); 
     //add Listeners 
     oneLeft.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       try { 
        write(outStream, "oneLeft has been clicked."); 
       } catch (IOException e1) { 
        // TODO Auto-generated catch block 
        e1.printStackTrace(); 
       } 
      } 
     }); 

     oneRight.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       try { 
        write(outStream, "oneRight has been clicked."); 
       } catch (IOException e1) { 
        // TODO Auto-generated catch block 
        e1.printStackTrace(); 
       } 
      } 
     }); 

     twoLeft.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       try { 
        write(outStream, "twoLeft has been clicked."); 
       } catch (IOException e1) { 
        // TODO Auto-generated catch block 
        e1.printStackTrace(); 
       } 
      } 
     }); 

     twoRight.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       try { 
        write(outStream, "twoRight has been clicked."); 
       } catch (IOException e1) { 
        // TODO Auto-generated catch block 
        e1.printStackTrace(); 
       } 
      } 
     }); 

     threeLeft.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       try { 
        write(outStream, "threeLeft has been clicked."); 
       } catch (IOException e1) { 
        // TODO Auto-generated catch block 
        e1.printStackTrace(); 
       } 
      } 
     }); 

     threeRight.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       try { 
        write(outStream, "threeRight has been clicked."); 
       } catch (IOException e1) { 
        // TODO Auto-generated catch block 
        e1.printStackTrace(); 
       } 
      } 
     }); 
    } catch (IOException ioe) { 
     System.out.println("The file could not be written."); 
    } 




    row1.add(oneLeft); 
    row1.add(oneRight); 
    row2.add(twoLeft); 
    row2.add(twoRight); 
    row3.add(threeLeft); 
    row3.add(threeRight); 
    add(row1); 
    add(row2); 
    add(row3); 



    setVisible(true); 
} 

private void setLookAndFeel() { 
    try { 
     UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"); 
    } catch (Exception e) { 
     //ignore error 
    } 
} 

void write(FileOutputStream stream, String output) throws IOException { 
    output = output + newLine; 
    byte[] data = output.getBytes(); 
    stream.write(data, 0, data.length); 
} 

public static void main(String[] args) { 
    prog progApp = new prog(); 
} 
} 
+0

Итак, у меня должен быть пустой метод, хотя он ничего не сделает? – David

+0

Если ваш класс реализует интерфейс. Лучше удалите объявление реализации – Reimeus

+1

Если это так, то вашему классу не нужно «выполнять ActionListener». –

ответ

2

Вы implement ActionListener это, но вы на самом деле не реализуют необходимые методы (то есть, actionPerformed()). Поэтому ваш класс недействителен для компилятора.

Вам нужен метод, как:

@Override 
public void actionPerformed(ActionEvent e) { 
    // ... 
} 

Путь интерфейс работает в том, что он определяет, что классы, которые implements это надо ... ну ... реализовать. Таким образом, любой другой процесс может рассматривать его как ActionListener и знать, что определенные методы определены.

Еще один способ, которым Java пытается сделать полиморфизм вашим другом.

Чтобы решить что-либо из приведенного ниже комментария, на самом деле не так уж редко встречается, что класс реализует интерфейс (например, KeyListener) и определяет метод, даже не используя его.

Например, KeyListener требует, чтобы реализовать три различных метода:

  • public void keyPressed(KeyEvent e);
  • public void keyReleased(KeyEvent e);
  • public void keyTyped(KeyEvent e);

Скажем, я только действительно заботитесь о keyPressed. Тогда мой класс может выглядеть примерно так:

public class MyKeyListener implements KeyListener { 

    @Override 
    public void keyPressed(KeyEvent e) { 
     // do stuff 
    } 

    @Override 
    public void keyReleased(KeyEvent e){} 

    @Override 
    public void keyTyped(KeyEvent e){} 

} 
+0

Так что я должен реализовать метод actionPerformed, даже не используя его? – David

+0

@David Если вы «реализуете ActionListener», то да. Но похоже, что вам это даже не нужно в вашем основном классе. Вы выполняете всю свою обработку в анонимных подклассах, которые вы определяете внутри. – asteri

+0

@David Существует отличное объяснение того, как это работает по этому вопросу: http://stackoverflow.com/questions/355167/how-are-anonymous-inner-classes-used-in-java – asteri

3

Ваш класс не должен реализовывать ActionListener. Вместо написания класса верхнего уровня, который реализует интерфейс, вы пишете множество небольших встроенных классов (называемых анонимными внутренними классами), которые делают это для вас, когда вы говорите new ActionListener().

Смежные вопросы