简体   繁体   English

(作业)对话窗口的问题,以及关闭对话框时执行操作

[英](Homework) Issues with Dialog Window, and Performing Action upon Closing Dialog

I'm working on a homework assignment that has four text fields and one text area, and a button that saves the text fields and text area to a text file, one element per line. 我正在做一个包含四个文本字段和一个文本区域的家庭作业,以及一个将文本字段和文本区域保存到文本文件的按钮,每行一个元素。 Then, a dialog should notify the user that the file has been saved. 然后,对话框应通知用户文件已保存。 It should then empty the text fields and text area when the dialog is closed. 然后,当对话框关闭时,它应该清空文本字段和文本区域。 However, I'm having some issues with the program. 但是,我对该程序有一些问题。

Regarding the dialog window, the program displays the following error when I attempt to compile: 关于对话框窗口,程序在我尝试编译时显示以下错误:

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

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

Second, I am unsure of how to empty the textfields and textareas after closing the dialog. 其次,我不确定在关闭对话框后如何清空文本字段和文本区域。 I know that emptying a textfield can be done by using code such as: 我知道可以使用以下代码清空文本字段:

[textfield].setText("");

But I'm not sure how to do this only after closing the dialog. 但是我不确定只有在关闭对话框后才能做到这一点。

Here is my code: 这是我的代码:

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

} }

I appreciate any help you can offer. 我感谢您提供的任何帮助。

JOptionPane.showMessageDialog(...) expects a Component as its first parameter. JOptionPane.showMessageDialog(...)期望Component作为其第一个参数。 In your case you're calling it from a class that extends an ActionListener and as such this does not refer to a component. 在您的情况下,您从扩展ActionListener的类中调用它,因此不会引用组件。 You can consider passing a null for this parameter. 您可以考虑为此参数传递null。 Something like this: 像这样的东西:

JOptionPane.showMessageDialog(null, "Saved");

Also as a sidenote, consider reading about Java Naming Convention . 另外作为旁注,请考虑阅读有关Java命名约定的内容 Class names ideally starts with a capital letter. 理想情况下,类名以大写字母开头。

Edit: If you look closely in your code, in your constructor you're creating local variables of the same name as your global variables and adding them to your panel. 编辑:如果仔细查看代码,在构造函数中,您将创建与全局变量同名的局部变量,并将它们添加到面板中。 For example, you have a global private JTextField toField; 例如,您有一个全局private JTextField toField; , however in your constructor you're doing something like this: ,但是在你的构造函数中,你正在做这样的事情:

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

And so your global variable still remains null. 所以你的全局变量仍然是null。 When you try to perform any operation in your actionPerformed() code using this variable, you would experience a NullPointerException. 当您尝试使用此变量在actionPerformed()代码中执行任何操作时,您将遇到NullPointerException。

Here's the updated code for your reference. 这是更新的代码供您参考。 Note that I've made certain changes, especially to the class names and added SwingUtilities.invokeLater(....) to execute your code. 请注意,我做了一些更改,特别是对类名,并添加了SwingUtilities.invokeLater(....)来执行代码。 To know why this is necessary, read about "The Event Dispatch Thread" and "Concurrency in Swing" 要知道为什么这是必要的,请阅读“事件调度线程”“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);

            }
        });
    }
}

this指的是非组件,因此它不能用于对话框的父级。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM