gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 07:29:40 31 4
gpt4 key购买 nike

我正在做一项家庭作业,该作业有四个文本字段和一个文本区域,以及一个将文本字段和文本区域保存到文本文件的按钮,每行一个元素。然后,应出现一个对话框通知用户文件已保存。当对话框关闭时,它应该清空文本字段和文本区域。但是,我在使用该程序时遇到了一些问题。

关于对话框窗口,当我尝试编译时,程序显示以下错误:

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

}

感谢您提供的任何帮助。

最佳答案

JOptionPane.showMessageDialog(...) 需要一个 Component 作为其第一个参数。在您的情况下,您从扩展 ActionListener 的类中调用它,因此 this 并不引用组件。您可以考虑为此参数传递 null。像这样的事情:

JOptionPane.showMessageDialog(null, "Saved");

另外,作为旁注,请考虑阅读 Java Naming Convention 。类名最好以大写字母开头。

编辑:如果您仔细查看代码,您会在构造函数中创建与全局变量同名的局部变量,并将它们添加到面板中。例如,您有一个全局 private JTextField toField;,但是在构造函数中您正在执行以下操作:

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

所以你的全局变量仍然保持为空。当您尝试使用此变量在 actionPerformed() 代码中执行任何操作时,您将遇到 NullPointerException。

这是更新后的代码供您引用。请注意,我进行了某些更改,尤其是对类名称的更改,并添加了 SwingUtilities.invokeLater(....) 来执行您的代码。要了解为什么这是必要的,请阅读 "The Event Dispatch Thread""Concurrency in 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);

}
});
}
}

关于java - (作业)对话框窗口的问题以及关闭对话框时执行操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13092056/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com