请写一个Java程序,要求如下:实现一个记事本,有基本的功能(如打开,保存,另存为,复制粘贴等)除此之外,有三个文本框,第一个文本框可以输入一个网址,点击查询按钮,会在第二个文本框里显示该网页的内容,再点击统计按钮,会在第三个文本框里显示网页内容的汉字,字符个数统计结果
时间: 2024-03-05 15:55:01 浏览: 63
一个用java编写的记事本小程序[文].pdf
好的,我可以帮你写一个Java程序,实现上述功能。但是需要说明的是,程序的界面可能不是很美观,因为我主要关注实现功能,而非界面设计。那么我们开始吧!
首先,你需要创建一个Java项目,并在项目中创建一个名为 `NotePad` 的类,代码如下:
```java
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class NotePad extends JFrame implements ActionListener {
private JTextArea textArea; // 记事本文本框
private JTextField urlField; // 网址输入框
private JTextArea contentArea; // 网页内容显示框
private JTextArea countArea; // 统计结果显示框
public NotePad() {
// 创建记事本菜单
JMenuBar menuBar = new JMenuBar();
JMenu menuFile = new JMenu("文件");
JMenuItem menuItemOpen = new JMenuItem("打开");
menuItemOpen.addActionListener(this);
JMenuItem menuItemSave = new JMenuItem("保存");
menuItemSave.addActionListener(this);
JMenuItem menuItemSaveAs = new JMenuItem("另存为");
menuItemSaveAs.addActionListener(this);
menuFile.add(menuItemOpen);
menuFile.add(menuItemSave);
menuFile.add(menuItemSaveAs);
menuBar.add(menuFile);
setJMenuBar(menuBar);
// 创建记事本文本框
textArea = new JTextArea();
textArea.setLineWrap(true);
textArea.setWrapStyleWord(true);
JScrollPane scrollPane = new JScrollPane(textArea);
add(scrollPane, BorderLayout.CENTER);
// 创建网址输入框和查询、统计按钮
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
urlField = new JTextField();
JButton searchButton = new JButton("查询");
searchButton.addActionListener(this);
JButton countButton = new JButton("统计");
countButton.addActionListener(this);
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new GridLayout(1, 2));
buttonPanel.add(searchButton);
buttonPanel.add(countButton);
panel.add(urlField, BorderLayout.NORTH);
panel.add(buttonPanel, BorderLayout.CENTER);
add(panel, BorderLayout.NORTH);
// 创建网页内容显示框和统计结果显示框
JPanel contentPanel = new JPanel();
contentPanel.setLayout(new GridLayout(1, 2));
contentArea = new JTextArea();
contentArea.setLineWrap(true);
contentArea.setWrapStyleWord(true);
JScrollPane contentScrollPane = new JScrollPane(contentArea);
countArea = new JTextArea();
countArea.setEditable(false);
countArea.setLineWrap(true);
countArea.setWrapStyleWord(true);
JScrollPane countScrollPane = new JScrollPane(countArea);
contentPanel.add(contentScrollPane);
contentPanel.add(countScrollPane);
add(contentPanel, BorderLayout.SOUTH);
// 设置记事本窗口属性
setTitle("记事本");
setSize(800, 600);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
switch (e.getActionCommand()) {
case "打开":
openFile();
break;
case "保存":
saveFile();
break;
case "另存为":
saveAsFile();
break;
case "查询":
search();
break;
case "统计":
count();
break;
}
}
// 打开文件
private void openFile() {
JFileChooser fileChooser = new JFileChooser();
int result = fileChooser.showOpenDialog(this);
if (result == JFileChooser.APPROVE_OPTION) {
File file = fileChooser.getSelectedFile();
try {
BufferedReader reader = new BufferedReader(new FileReader(file));
String line;
textArea.setText("");
while ((line = reader.readLine()) != null) {
textArea.append(line + "\n");
}
reader.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
// 保存文件
private void saveFile() {
if (textArea.getText().isEmpty()) {
JOptionPane.showMessageDialog(this, "文件内容为空,无法保存");
return;
}
JFileChooser fileChooser = new JFileChooser();
int result = fileChooser.showSaveDialog(this);
if (result == JFileChooser.APPROVE_OPTION) {
File file = fileChooser.getSelectedFile();
try {
BufferedWriter writer = new BufferedWriter(new FileWriter(file));
writer.write(textArea.getText());
writer.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
// 另存为文件
private void saveAsFile() {
if (textArea.getText().isEmpty()) {
JOptionPane.showMessageDialog(this, "文件内容为空,无法保存");
return;
}
JFileChooser fileChooser = new JFileChooser();
int result = fileChooser.showSaveDialog(this);
if (result == JFileChooser.APPROVE_OPTION) {
File file = fileChooser.getSelectedFile();
try {
BufferedWriter writer = new BufferedWriter(new FileWriter(file));
writer.write(textArea.getText());
writer.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
// 查询网页内容
private void search() {
String url = urlField.getText();
if (url.isEmpty()) {
JOptionPane.showMessageDialog(this, "请输入网址");
return;
}
try {
URL u = new URL(url);
BufferedReader reader = new BufferedReader(new InputStreamReader(u.openStream(), "UTF-8"));
String line;
contentArea.setText("");
while ((line = reader.readLine()) != null) {
contentArea.append(line + "\n");
}
reader.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
// 统计汉字和字符个数
private void count() {
String content = contentArea.getText();
if (content.isEmpty()) {
JOptionPane.showMessageDialog(this, "网页内容为空,无法统计");
return;
}
int hanziCount = 0;
int charCount = 0;
for (int i = 0; i < content.length(); i++) {
char c = content.charAt(i);
if (isHanzi(c)) {
hanziCount++;
}
if (!Character.isWhitespace(c)) {
charCount++;
}
}
countArea.setText("汉字个数:" + hanziCount + "\n" + "字符个数:" + charCount);
}
// 判断字符是否是汉字
private boolean isHanzi(char c) {
Pattern pattern = Pattern.compile("[\u4e00-\u9fa5]");
Matcher matcher = pattern.matcher(String.valueOf(c));
return matcher.matches();
}
public static void main(String[] args) {
new NotePad();
}
}
```
代码说明:
1. `NotePad` 类继承自 `JFrame` 类,并实现了 `ActionListener` 接口,用于监听菜单和按钮的点击事件。
2. `NotePad` 类中包含一个记事本文本框 (`textArea`) 和三个用于网页查询和统计的组件:网址输入框 (`urlField`)、网页内容显示框 (`contentArea`) 和统计结果显示框 (`countArea`)。
3. `NotePad` 类的构造方法中创建了记事本菜单和记事本文本框,并将它们添加到窗口中。
4. `NotePad` 类的构造方法中创建了网址输入框、查询按钮和统计按钮,并将它们添加到窗口中。
5. `NotePad` 类的构造方法中创建了网页内容显示框和统计结果显示框,并将它们添加到窗口中。
6. `NotePad` 类实现了 `actionPerformed` 方法,用于处理菜单和按钮的点击事件。具体实现如下:
- 如果点击了“打开”菜单,则调用 `openFile` 方法打开文件。
- 如果点击了“保存”菜单,则调用 `saveFile` 方法保存文件。
- 如果点击了“另存为”菜单,则调用 `saveAsFile` 方法另存文件。
- 如果点击了“查询”按钮,则调用 `search` 方法查询网页内容。
- 如果点击了“统计”按钮,则调用 `count` 方法统计网页内容的汉字和字符个数。
7. `NotePad` 类中的 `openFile`、`saveFile` 和 `saveAsFile` 方法分别用于打开、保存和另存文件。具体实现如下:
- `openFile` 方法会弹出一个文件选择对话框,选择要打开的文件后,将文件的内容读入记事本文本框中。
- `saveFile` 方法会弹出一个文件选择对话框,选择要保存的文件后,将记事本文本框中的内容写入文件中。
- `saveAsFile` 方法与 `saveFile` 方法类似,不同之处在于它始终弹出文件选择对话框,让用户选择文件路径。
8. `NotePad` 类中的 `search` 方法用于查询网页内容。具体实现如下:
- 首先获取用户输入的网址。
- 然后根据网址创建一个 `URL` 对象,并使用 `openStream()` 方法打开该网页的输入流。
- 通过 `InputStreamReader` 类将输入流转换为字符流,并指定字符集为 UTF-8。
- 使用 `BufferedReader` 类读取字符流,并将读取到的内容显示在网页内容显示框中。
9. `NotePad` 类中的 `count` 方法用于统计网页内容的汉字和字符个数。具体实现如下:
- 首先获取网页内容。
- 然后遍历网页内容,统计汉字和字符个数。
- 最后将统计结果显示在统计结果显示框中。
10. `NotePad` 类中的 `isHanzi` 方法用于判断一个字符是否是汉字。具体实现如下:
- 使用正则表达式判断字符是否在 Unicode 编码范围 `\u4e00-\u9fa5` 内。
11. `NotePad` 类的 `main` 方法用于启动程序。
阅读全文