使用Swing提供的组件创建一个类似金山打字通的程序,统计用户每分钟输入的字符数目、正确字符数目、正确率。
时间: 2023-06-27 11:04:59 浏览: 103
以下是一个简单的示例代码,使用Swing提供的组件创建一个类似金山打字通的程序,并统计用户每分钟输入的字符数目、正确字符数目、正确率。其中,程序会随机生成一个包含所有大小写字母和数字的字符串作为测试文本,用户需要在输入框中输入并进行统计。
```
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.Timer;
public class TypingTest extends JFrame implements ActionListener {
private static final long serialVersionUID = 1L;
private JTextField inputField;
private JLabel textLabel, resultLabel;
private JButton startButton, resetButton;
private Timer timer;
private int totalTime, correctCount, totalCount;
private String testText;
public TypingTest() {
initUI();
initTimer();
initTestText();
}
private void initUI() {
setTitle("Typing Test");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 输入框
inputField = new JTextField();
inputField.setFont(new Font("Arial", Font.PLAIN, 16));
inputField.addActionListener(this);
// 文本标签
textLabel = new JLabel();
textLabel.setFont(new Font("Arial", Font.PLAIN, 20));
textLabel.setHorizontalAlignment(JLabel.CENTER);
textLabel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
// 开始按钮
startButton = new JButton("Start");
startButton.addActionListener(this);
// 重置按钮
resetButton = new JButton("Reset");
resetButton.addActionListener(this);
resetButton.setEnabled(false);
// 统计结果标签
resultLabel = new JLabel();
resultLabel.setFont(new Font("Arial", Font.PLAIN, 16));
resultLabel.setHorizontalAlignment(JLabel.CENTER);
// 主面板
JPanel mainPanel = new JPanel(new BorderLayout(10, 10));
mainPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
mainPanel.add(inputField, BorderLayout.NORTH);
mainPanel.add(textLabel, BorderLayout.CENTER);
// 按钮面板
JPanel buttonPanel = new JPanel();
buttonPanel.add(startButton);
buttonPanel.add(resetButton);
// 结果面板
JPanel resultPanel = new JPanel(new BorderLayout(10, 10));
resultPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
resultPanel.add(resultLabel, BorderLayout.CENTER);
resultPanel.add(buttonPanel, BorderLayout.SOUTH);
// 添加组件到窗口
getContentPane().setLayout(new BorderLayout(10, 10));
getContentPane().add(mainPanel, BorderLayout.CENTER);
getContentPane().add(resultPanel, BorderLayout.SOUTH);
// 调整窗口大小并居中显示
pack();
setLocationRelativeTo(null);
}
private void initTimer() {
// 时间计时器,每秒更新一次
timer = new Timer(1000, new ActionListener() {
public void actionPerformed(ActionEvent e) {
totalTime++;
updateResultLabel();
}
});
}
private void initTestText() {
// 随机生成测试文本,包含大小写字母和数字
Random random = new Random();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 50; i++) {
int c = random.nextInt(62);
if (c < 26) {
sb.append((char) ('a' + c));
} else if (c < 52) {
sb.append((char) ('A' + c - 26));
} else {
sb.append((char) ('0' + c - 52));
}
}
testText = sb.toString();
textLabel.setText(testText);
}
private void updateResultLabel() {
// 计算统计结果并更新标签显示
double accuracy = (double) correctCount / totalCount * 100;
double speed = (double) totalCount / totalTime * 60;
String result = String.format("Time: %d s, Speed: %.2f cpm, Accuracy: %.2f%%", totalTime, speed, accuracy);
resultLabel.setText(result);
}
private void startTest() {
totalCount = 0;
correctCount = 0;
totalTime = 0;
inputField.setEnabled(true);
inputField.setText("");
startButton.setEnabled(false);
resetButton.setEnabled(true);
timer.start();
}
private void finishTest() {
inputField.setEnabled(false);
startButton.setEnabled(true);
resetButton.setEnabled(true);
timer.stop();
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == startButton) {
startTest();
} else if (e.getSource() == resetButton) {
finishTest();
} else if (e.getSource() == inputField) {
String inputText = inputField.getText();
if (inputText.equals(testText)) {
finishTest();
} else {
totalCount += inputText.length();
for (int i = 0; i < inputText.length() && i < testText.length(); i++) {
if (inputText.charAt(i) == testText.charAt(i)) {
correctCount++;
}
}
updateResultLabel();
}
}
}
public static void main(String[] args) {
TypingTest typingTest = new TypingTest();
typingTest.setVisible(true);
}
}
```
这个程序的界面比较简单,分为三个部分:
- 顶部是输入框,用户需要在这里输入测试文本。
- 中间是文本标签,用于显示测试文本。
- 底部是统计结果标签和按钮面板。统计结果标签会显示当前已经输入的字符数目、正确字符数目、正确率和经过的时间。按钮面板包含一个开始按钮和一个重置按钮,用户可以通过点击这两个按钮开始新的测试或者重置统计结果。
程序中使用了一个计时器来记录测试的时间。每次用户输入字符时,会检查输入的文本是否与测试文本相同,如果相同则结束测试,否则会统计输入的字符数目、正确字符数目和正确率,并更新结果标签的显示。
这个程序只是一个简单的示例,如果要实现更加完整的打字测试功能,还需要考虑一些其他的因素,比如测试文本的难度、输入错误的处理等。