2

そのため、ユーザーのクリックに基づいてファイルに書き込むようにこのコードを作成しています。私が持っている唯一の問題は、「public class prog」でエラーが発生することです。prog 名は、エラーが発生する場所です。次のように書かれています。継承されていないメソッドを追加するクイックフィックスを実行すると、コードの最後にアクション リスナー メソッドが追加されますが、何も含まれていません。プログラムに既にアクション リスナーがある場合、それらを実装する必要があると表示されるのはなぜですか? そして、最後に追加すると、何も入っていないのに正常に動作するのはなぜですか?

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();
}
}
4

2 に答える 2

2

あなたimplement ActionListenerはそれをしますが、実際には必要なメソッド (つまりactionPerformed()) を実装していません。したがって、あなたのクラスはコンパイラにとって無効です。

次のような方法が必要です。

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

インターフェイスが機能する方法は、クラスが何を実装する必要があるかを定義することimplementsです...まあ...実装します。そうすれば、他のプロセスはそれを として扱いActionListener、特定のメソッドが定義されていることを知ることができます。

Java がポリモーフィズムを味方にしようとするもう 1 つの方法です。

以下のコメントから何かに対処するために、実際には、クラスがインターフェイス (のようなKeyListener) を実装し、それを使用することさえせずにメソッドを定義するのを見るのはそれほど珍しいことではありません。

たとえば、KeyListener次の 3 つの異なるメソッドを実装する必要があります。

  • 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){}

}
于 2013-08-14T22:13:18.063 に答える