0

4つのテキストフィールドと1つのテキスト領域、およびテキストフィールドとテキスト領域を1行に1つの要素でテキストファイルに保存するボタンがある宿題の割り当てに取り組んでいます。次に、ファイルが保存されたことをユーザーに通知するダイアログが表示されます。ダイアログを閉じると、テキストフィールドとテキスト領域が空になります。ただし、プログラムに問題があります。

ダイアログウィンドウに関して、コンパイルしようとすると、プログラムは次のエラーを表示します。

emailProg.java:81: error: no suitable method found for showMessageDialog(emailProg.sendAction, String)

JOptionPane.showMessageDialog(this, "Saved");
           ^

次に、ダイアログを閉じた後、テキストフィールドとテキストエリアを空にする方法がわかりません。テキストフィールドを空にすることは、次のようなコードを使用して実行できることを知っています。

[textfield].setText("");

しかし、ダイアログを閉じた後でのみこれを行う方法がわかりません。

これが私のコードです:

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

public class emailProg extends JFrame {
    private JPanel panNorth;
    private JPanel panCenter;
    private JPanel panSouth;

    private JLabel toLabel;
    private JLabel ccLabel;
    private JLabel bccLabel;
    private JLabel subLabel;
    private JLabel msgLabel;

    private JTextField toField;
    private JTextField ccField;
    private JTextField bccField;
    private JTextField subField;
    private JTextArea msgArea;

    private JButton send;

//The Constructor
public emailProg() {
    setTitle("Compose Email");
    setLayout(new BorderLayout());

    panNorth = new JPanel();
    panNorth.setLayout(new GridLayout(4, 2));
    JLabel toLabel = new JLabel("To:");
    panNorth.add(toLabel);
    JTextField toField = new JTextField(15);
    panNorth.add(toField);
    JLabel ccLabel = new JLabel("CC:");
    panNorth.add(ccLabel);
    JTextField ccField = new JTextField(15);
    panNorth.add(ccField);
    JLabel bccLabel = new JLabel("Bcc:");
    panNorth.add(bccLabel);
    JTextField bccField = new JTextField(15);
    panNorth.add(bccField);
    JLabel subLabel = new JLabel("Subject:");
    panNorth.add(subLabel);
    JTextField subField = new JTextField(15);
    panNorth.add(subField);
    add(panNorth, BorderLayout.NORTH);

    panCenter = new JPanel();
    panCenter.setLayout(new GridLayout(2, 1));
    JLabel msgLabel = new JLabel("Message:");
    panCenter.add(msgLabel);
    JTextArea msgArea = new JTextArea(5, 15);
    panCenter.add(msgArea);
    add(panCenter, BorderLayout.CENTER);

    panSouth = new JPanel();
    panSouth.setLayout(new FlowLayout());
    JButton send = new JButton("Send");
    panSouth.add(send);
    add(panSouth, BorderLayout.SOUTH);

    send.addActionListener (new sendAction());
}

private class sendAction implements ActionListener {
    public void actionPerformed (ActionEvent event) {
        try {
            PrintWriter outfile = new PrintWriter("email.txt");
            outfile.print("To: ");
            outfile.println(toField.getText());
            outfile.print("CC: ");
            outfile.println(ccField.getText());
            outfile.print("Bcc: ");
            outfile.println(bccField.getText());
            outfile.print("Subject: ");
            outfile.println(subField.getText());
            outfile.print("Message: ");
            outfile.println(msgArea.getText());

            JOptionPane.showMessageDialog(this, "Saved");
        }
        catch(FileNotFoundException e) {
        System.out.println("File not found.");
        }
    }
}

public static void main(String[] args) {
    emailProg win = new emailProg();
    win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    win.pack();
    win.setVisible(true);
}

}

私はあなたが提供できるどんな助けにも感謝します。

4

2 に答える 2

2

JOptionPane.showMessageDialog(...)最初のパラメーターとしてコンポーネントが必要です。あなたの場合、 ActionListener を拡張するクラスから呼び出しているため、これはコンポーネントを参照していません。このパラメーターに null を渡すことを検討できます。このようなもの:

JOptionPane.showMessageDialog(null, "Saved");

また、補足として、 Java Naming Conventionについて読むことを検討してください。クラス名は大文字で始めるのが理想的です。

編集:コードをよく見ると、コンストラクターでグローバル変数と同じ名前のローカル変数を作成し、それらをパネルに追加しています。たとえば、 global がありますがprivate JTextField toField;、コンストラクターでは次のようにしています。

JTextField toField = new JTextField(15);
panNorth.add(toField);

そのため、グローバル変数はまだ null のままです。この変数を使用してコード内で操作を実行しようとするとactionPerformed()、NullPointerException が発生します。

参照用に更新されたコードを次に示します。特にクラス名に特定の変更を加えSwingUtilities.invokeLater(....)、コードを実行するために追加したことに注意してください。これが必要な理由を知るには、「イベント ディスパッチ スレッド」「Swing の同時実行」を参照してください。

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileNotFoundException;
import java.io.PrintWriter;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class EmailProg extends JFrame {
    private JPanel panNorth;
    private JPanel panCenter;
    private JPanel panSouth;

    private JLabel toLabel;
    private JLabel ccLabel;
    private JLabel bccLabel;
    private JLabel subLabel;
    private JLabel msgLabel;

    private JTextField toField;
    private JTextField ccField;
    private JTextField bccField;
    private JTextField subField;
    private JTextArea msgArea;

    private JButton send;

    // The Constructor
    public EmailProg() {
        setTitle("Compose Email");
        setLayout(new BorderLayout());

        panNorth = new JPanel();
        panNorth.setLayout(new GridLayout(4, 2));
        toLabel = new JLabel("To:");
        panNorth.add(toLabel);
        toField = new JTextField(15);
        panNorth.add(toField);
        ccLabel = new JLabel("CC:");
        panNorth.add(ccLabel);
        ccField = new JTextField(15);
        panNorth.add(ccField);
        bccLabel = new JLabel("Bcc:");
        panNorth.add(bccLabel);
        bccField = new JTextField(15);
        panNorth.add(bccField);
        subLabel = new JLabel("Subject:");
        panNorth.add(subLabel);
        subField = new JTextField(15);
        panNorth.add(subField);
        add(panNorth, BorderLayout.NORTH);

        panCenter = new JPanel();
        panCenter.setLayout(new GridLayout(2, 1));
        msgLabel = new JLabel("Message:");
        panCenter.add(msgLabel);
        msgArea = new JTextArea(5, 15);
        panCenter.add(msgArea);
        add(panCenter, BorderLayout.CENTER);

        panSouth = new JPanel();
        panSouth.setLayout(new FlowLayout());
        send = new JButton("Send");
        panSouth.add(send);
        add(panSouth, BorderLayout.SOUTH);

        send.addActionListener(new SendAction());
    }

    private class SendAction implements ActionListener {
        public void actionPerformed(ActionEvent event) {
            try {
                PrintWriter outfile = new PrintWriter("email.txt");
                outfile.print("To: ");
                outfile.println(toField.getText());
                outfile.print("CC: ");
                outfile.println(ccField.getText());
                outfile.print("Bcc: ");
                outfile.println(bccField.getText());
                outfile.print("Subject: ");
                outfile.println(subField.getText());
                outfile.print("Message: ");
                outfile.println(msgArea.getText());

                JOptionPane.showMessageDialog(null, "Saved");
            } catch (FileNotFoundException e) {
                System.out.println("File not found.");
            }
        }
    }

    public static void main(String[] args) {

        //Make sure that all your operations happens through the EDT
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                EmailProg win = new EmailProg();
                win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                win.pack();
                win.setVisible(true);

            }
        });
    }
}
于 2012-10-26T18:09:56.993 に答える
0

this非コンポーネントを参照するため、ダイアログの親には使用できません。

于 2012-10-26T18:08:53.643 に答える