1、建立一个GUI程序
2、输入任意个整数
3、对数据进行排序,要求使用线程实现输入数据的排序,用户每输入一个数据就通知排序线程的当前输入的所有数据排序
4、将排序后的数据写入文件
5、利用面向对象的思想设计数据集合类、界面类
6、数据集合类要具有插入、删除、查找、排序等方法,不能使用Tlist等系统提供的集合类。
7、可以使用GUI设计工具。
package test;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.util.Arrays;
public class IntegerInputSortSaveFileGUI extends JFrame {
private JTextField textField;
private JButton buttonEnter, buttonSort, buttonDelete, buttonFind;
private JTextArea textArea;
private NumberList numberList = new NumberList();
private Thread sortThread;
private final Object lock = new Object(); // 对共享变量性质的锁
public IntegerInputSortSaveFileGUI() {
super("数字输入排序保存GUI");
setSize(400, 300);
setLocationRelativeTo(null); //参数为null时居中显示
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//添加窗口布局和控件
JPanel panel = new JPanel();
add(panel);
JLabel label = new JLabel("请输入数字:");
panel.add(label);
textField = new JTextField(10); // 可输入10个字符
panel.add(textField);
buttonEnter = new JButton("输入");
buttonEnter.addActionListener(e -> enterButtonAction()); //lambda表达式添加事件监听器
panel.add(buttonEnter);
buttonSort = new JButton("排序");
buttonSort.addActionListener(e -> sortButtonAction()); //lambda表达式添加事件监听器
panel.add(buttonSort);
buttonDelete = new JButton("删除");
buttonDelete.addActionListener(e -> deleteButtonAction());
panel.add(buttonDelete);
buttonFind = new JButton("查找");
buttonFind.addActionListener(e -> findButtonAction());
panel.add(buttonFind);
textArea = new JTextArea(10, 20);
textArea.setEditable(false);
JScrollPane scrollPane = new JScrollPane(textArea); // 添加滑动条
panel.add(scrollPane);
setVisible(true);
}
private void enterButtonAction() {
try {
int num = Integer.parseInt(textField.getText().trim()); // 转换为int类型
numberList.insert(num);
SwingUtilities.invokeLater(() -> showNumbers()); // 异步更新GUI界面
} catch (NumberFormatException ex) {
JOptionPane.showMessageDialog(this, "请输入正确的数字!");
} finally {
textField.setText(""); // 清空文本框内容
textField.requestFocus(); // 文本框重新获得焦点
}
}
private void sortButtonAction() {
synchronized (lock) {
numberList.sort();
SwingUtilities.invokeLater(() -> showNumbers());
saveToFile();
}
}
private void deleteButtonAction() {
String inputStr = JOptionPane.showInputDialog(this, "请输入待删除的数字:");
if (inputStr != null) { // 用户点击取消时返回null
try {
int num = Integer.parseInt(inputStr.trim());
if (numberList.delete(num)) {
SwingUtilities.invokeLater(() -> showNumbers());
saveToFile();
} else {
JOptionPane.showMessageDialog(this, "该数字不存在!");
}
} catch (NumberFormatException ex) {
JOptionPane.showMessageDialog(this, "请输入正确的数字!");
}
}
}
private void findButtonAction() {
String inputStr = JOptionPane.showInputDialog(this, "请输入待查找的数字:");
if (inputStr != null) { // 用户点击取消时返回null
try {
int num = Integer.parseInt(inputStr.trim());
int index = numberList.find(num);
if (index >= 0) {
JOptionPane.showMessageDialog(this, "该数字位于数据集合中的位置为:" + (index + 1)); // 位置从1开始,所以在查询结果加1
} else {
JOptionPane.showMessageDialog(this, "该数字不存在!");
}
} catch (NumberFormatException ex) {
JOptionPane.showMessageDialog(this, "请输入正确的数字!");
}
}
}
private void startSortThread() {
sortThread = new Thread(() -> {
while (true) {
synchronized (lock) { // 加锁判断是否需要排序
try {
lock.wait(); // 线程进入等待状态,直到有新数据需要排序
} catch (InterruptedException e) {
e.printStackTrace();
}
numberList.sort();
SwingUtilities.invokeLater(() -> showNumbers()); // 异步更新GUI界面
saveToFile();
}
}
});
sortThread.start();
}
private void showNumbers() {
textArea.setText(numberList.toString()); // 将数字展示在文本区域中
}
private void saveToFile() {
try {
BufferedWriter writer = new BufferedWriter(new FileWriter("sorted_numbers.txt"));
writer.write(numberList.toString());
writer.close();
} catch (Exception ex) {
JOptionPane.showMessageDialog(this, "写入文件出现错误!");
}
}
public static void main(String[] args) {
IntegerInputSortSaveFileGUI gui = new IntegerInputSortSaveFileGUI();
gui.startSortThread(); // 创建并启动排序线程
}
}
class NumberList {
private int[] nums = new int[0];
public void insert(int num) {
int[] temp = Arrays.copyOf(nums, nums.length + 1);
temp[nums.length] = num;
nums = temp;
}
public boolean delete(int num) {
int index = find(num);
if (index >= 0) { // 找到了需要删除的数字
int[] temp = new int[nums.length - 1];
System.arraycopy(nums, 0, temp, 0, index); // 复制前面的元素
System.arraycopy(nums, index + 1, temp, index, nums.length - index - 1); // 复制后面的元素
nums = temp;
return true;
} else { // 没有找到所需删除的数字
return false;
}
}
public int find(int num) {
for (int i = 0; i < nums.length; i++) {
if (nums[i] == num) {
return i;
}
}
return -1; // 没有找到所需查找的数字
}
public void sort() {
Arrays.sort(nums);
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
for (int num : nums) {
sb.append(num).append("\n");
}
return sb.toString();
}
}