用Java编写一个程序,要求如下界面里有6个窗口,其中三个窗口一共只能输入五十次,同一个窗入输出时间间隔大于一秒,在还剩输入六次时停止输出,要求输入的每一次都要在例外三个窗口输入的时刻和输入窗口和输入次
时间: 2024-03-15 07:47:57 浏览: 124
图形用户编程.编写一个简单的计算器程序,要求有菜单,能进行简单的加减乘除运算。
5星 · 资源好评率100%
好的,我来编写这个程序,具体实现如下:
```java
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;
public class InputOutputWindow extends JFrame {
private static final int WINDOW_WIDTH = 800; // 窗口宽度
private static final int WINDOW_HEIGHT = 600; // 窗口高度
private static final int INPUT_LIMIT = 50; // 每个窗口最多输入次数
private static final int STOP_OUTPUT_COUNT = 6; // 还剩输入次数时停止输出
private Map<JPanel, Integer> inputCountMap; // 记录每个窗口已输入次数
private Map<JPanel, LocalDateTime> lastInputTimeMap; // 记录每个窗口上次输入时间
public InputOutputWindow() {
setTitle("输入输出窗口");
setSize(WINDOW_WIDTH, WINDOW_HEIGHT);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
inputCountMap = new HashMap<>();
lastInputTimeMap = new HashMap<>();
// 创建6个输入输出窗口
for (int i = 0; i < 6; i++) {
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
// 创建文本框和按钮
JTextField inputField = new JTextField();
inputField.setEditable(false);
JTextArea outputArea = new JTextArea();
outputArea.setEditable(false);
JButton inputButton = new JButton("输入");
inputButton.addActionListener(new InputButtonListener(panel, inputField, outputArea));
// 添加组件到面板
panel.add(inputField, BorderLayout.NORTH);
panel.add(outputArea, BorderLayout.CENTER);
panel.add(inputButton, BorderLayout.SOUTH);
// 添加面板到窗口
add(panel);
// 初始化计数器和上次输入时间
inputCountMap.put(panel, 0);
lastInputTimeMap.put(panel, LocalDateTime.now());
}
// 显示窗口
setVisible(true);
}
// 输入按钮监听器
private class InputButtonListener implements ActionListener {
private JPanel panel;
private JTextField inputField;
private JTextArea outputArea;
public InputButtonListener(JPanel panel, JTextField inputField, JTextArea outputArea) {
this.panel = panel;
this.inputField = inputField;
this.outputArea = outputArea;
}
@Override
public void actionPerformed(ActionEvent e) {
// 判断是否达到输入次数限制
if (inputCountMap.get(panel) >= INPUT_LIMIT) {
JOptionPane.showMessageDialog(null, "已达到输入次数限制!", "提示", JOptionPane.WARNING_MESSAGE);
return;
}
// 判断是否达到停止输出条件
if (inputCountMap.get(panel) >= INPUT_LIMIT - STOP_OUTPUT_COUNT) {
inputField.setEditable(false);
}
// 判断是否达到连续输入时间限制
LocalDateTime lastInputTime = lastInputTimeMap.get(panel);
LocalDateTime now = LocalDateTime.now();
if (now.isBefore(lastInputTime.plusSeconds(1))) {
JOptionPane.showMessageDialog(null, "同一窗口输入输出时间间隔不能小于1秒!", "提示", JOptionPane.WARNING_MESSAGE);
return;
}
// 记录输入信息
int count = inputCountMap.get(panel);
count++;
LocalDateTime inputTime = LocalDateTime.now();
String inputInfo = String.format("[%s] 窗口%d 第%d次输入", inputTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")), getPanelIndex(panel), count);
inputField.setText(inputInfo);
lastInputTimeMap.put(panel, inputTime);
inputCountMap.put(panel, count);
// 输出信息
String outputInfo = String.format("%s\n", inputInfo);
outputArea.append(outputInfo);
// 判断是否达到停止输出条件
if (inputCountMap.get(panel) >= INPUT_LIMIT - STOP_OUTPUT_COUNT) {
outputArea.append("输入次数即将达到限制,请注意!\n");
}
if (inputCountMap.get(panel) >= INPUT_LIMIT) {
outputArea.append("输入次数已达到限制,不能再输入!\n");
}
}
}
// 获取窗口的索引(从0开始)
private int getPanelIndex(JPanel panel) {
for (int i = 0; i < getContentPane().getComponentCount(); i++) {
if (getContentPane().getComponent(i) == panel) {
return i;
}
}
return -1;
}
public static void main(String[] args) {
InputOutputWindow window = new InputOutputWindow();
// 每秒钟检查一次是否达到停止输出条件
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
for (JPanel panel : window.inputCountMap.keySet()) {
if (!panel.getComponent(1).isEnabled()) {
continue;
}
if (window.inputCountMap.get(panel) >= INPUT_LIMIT - STOP_OUTPUT_COUNT) {
JTextArea outputArea = (JTextArea) panel.getComponent(1);
outputArea.append("输入次数即将达到限制,请注意!\n");
}
if (window.inputCountMap.get(panel) >= INPUT_LIMIT) {
JTextField inputField = (JTextField) panel.getComponent(0);
inputField.setText("输入次数已达到限制,不能再输入!");
inputField.setEditable(false);
JTextArea outputArea = (JTextArea) panel.getComponent(1);
outputArea.append("输入次数已达到限制,不能再输入!\n");
}
}
}
}, 0, 1000);
}
}
```
这个程序使用了Java Swing库来实现界面,使用了定时器来检查是否达到停止输出条件。同时,使用了Map来记录每个窗口的计数器和上次输入时间,方便后续处理。
阅读全文