请帮我写一个mvvm架构的Java应用程序。该程序的功能是:读取一个文本文件计算其中的中文和英文单词个数,请实现统计所读取的文件中文和英文单词个数的功能,完善这个程序
时间: 2024-02-25 08:51:38 浏览: 63
好的,我可以为您提供一个简单的 Java 应用程序,用于读取文本文件并计算其中的中文和英文单词个数,采用 MVVM 架构模式实现。
首先,我们需要明确 MVVM 架构的三个组成部分:
- Model:数据模型,用于封装业务数据和业务逻辑。
- View:视图,用于展示数据和接收用户操作。
- ViewModel:视图模型,作为 View 和 Model 之间的桥梁,处理 View 的输入和输出,并对 Model 进行操作。
基于上述定义,我们可以开始编写代码。以下是一个基本的 MVVM 应用程序的示例:
Model:
```java
public class TextFile {
private String fileName;
private int chineseWordCount;
private int englishWordCount;
public TextFile(String fileName) {
this.fileName = fileName;
}
public void calculateWordCount() {
// 读取文本文件并计算中文和英文单词个数
try {
BufferedReader reader = new BufferedReader(new FileReader(fileName));
String line;
while ((line = reader.readLine()) != null) {
String[] words = line.split(" ");
for (String word : words) {
if (word.matches("[\u4e00-\u9fa5]+")) {
chineseWordCount++;
} else {
englishWordCount++;
}
}
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public int getChineseWordCount() {
return chineseWordCount;
}
public int getEnglishWordCount() {
return englishWordCount;
}
}
```
View:
```java
public class TextFileView extends JFrame {
private JLabel fileNameLabel = new JLabel("文件名:");
private JTextField fileNameField = new JTextField(20);
private JButton calculateButton = new JButton("计算");
private JLabel chineseWordCountLabel = new JLabel("中文单词数:0");
private JLabel englishWordCountLabel = new JLabel("英文单词数:0");
public TextFileView() {
// 设置窗口属性
setTitle("中英文单词计数器");
setSize(300, 200);
setDefaultCloseOperation(EXIT_ON_CLOSE);
// 设置布局
JPanel panel = new JPanel();
panel.add(fileNameLabel);
panel.add(fileNameField);
panel.add(calculateButton);
panel.add(chineseWordCountLabel);
panel.add(englishWordCountLabel);
add(panel);
// 添加事件处理
calculateButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String fileName = fileNameField.getText();
TextFile textFile = new TextFile(fileName);
textFile.calculateWordCount();
chineseWordCountLabel.setText("中文单词数:" + textFile.getChineseWordCount());
englishWordCountLabel.setText("英文单词数:" + textFile.getEnglishWordCount());
}
});
}
}
```
ViewModel:
```java
public class TextFileViewModel {
private TextFile textFile;
private TextFileView view;
public TextFileViewModel(TextFile textFile, TextFileView view) {
this.textFile = textFile;
this.view = view;
initView();
}
private void initView() {
// 初始化 View 中的控件
view.fileNameField.setText(textFile.getFileName());
view.chineseWordCountLabel.setText("中文单词数:" + textFile.getChineseWordCount());
view.englishWordCountLabel.setText("英文单词数:" + textFile.getEnglishWordCount());
// 监听文件名输入框变化
view.fileNameField.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
updateFileName();
}
@Override
public void removeUpdate(DocumentEvent e) {
updateFileName();
}
@Override
public void changedUpdate(DocumentEvent e) {
updateFileName();
}
private void updateFileName() {
textFile.setFileName(view.fileNameField.getText());
}
});
// 监听计算按钮点击事件
view.calculateButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
textFile.calculateWordCount();
view.chineseWordCountLabel.setText("中文单词数:" + textFile.getChineseWordCount());
view.englishWordCountLabel.setText("英文单词数:" + textFile.getEnglishWordCount());
}
});
}
}
```
主程序:
```java
public class Main {
public static void main(String[] args) {
TextFile textFile = new TextFile("test.txt");
TextFileView view = new TextFileView();
TextFileViewModel viewModel = new TextFileViewModel(textFile, view);
view.setVisible(true);
}
}
```
在这个示例中,我们首先定义了 `TextFile` 类作为 Model,其中封装了文件名、中文单词个数和英文单词个数,并提供了 `calculateWordCount()` 方法用于读取文本文件并计算单词个数。在 View 中,我们使用了 `JFrame`、`JLabel`、`JTextField` 和 `JButton` 等 Swing 控件来展示数据和接收用户操作。在 ViewModel 中,我们将 View 和 Model 进行了绑定,并在其中处理了 View 的输入和输出,实现了对 Model 的操作。最后,在主程序中,我们实例化了 `TextFile`、`TextFileView` 和 `TextFileViewModel`,并将其连接起来,使整个应用程序得以运行。
当用户输入文件名并点击计算按钮时,程序会读取指定的文本文件,并计算其中的中文和英文单词个数,并将结果展示在视图中。
希望这个示例可以帮助您了解 MVVM 架构和 Java 应用程序的开发。
阅读全文