Java编写一个图形界面的火车票售票程序,有三个窗口用来显示售票及余票信息,两个按钮,分别为 开始售票 和 退出系统 点击开始售票按钮 三个窗口同时进行售票 票售完时 弹出消息框 提示已售完 点击 退出系统按钮 系统退出
时间: 2024-02-22 19:55:43 浏览: 29
好的,这是一个比较完整的Java GUI程序,需要用到Swing和多线程编程。下面是大致的代码框架,您可以根据需要进行修改和完善。
```java
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class TicketSellingSystem extends JFrame implements ActionListener {
private JLabel[] labels;
private JTextArea[] textAreas;
private JButton startButton, exitButton;
private int totalTickets = 100;
private int soldTickets = 0;
public TicketSellingSystem() {
// 初始化界面
labels = new JLabel[3];
textAreas = new JTextArea[3];
for (int i = 0; i < 3; i++) {
labels[i] = new JLabel("窗口" + (i + 1) + "售票情况:");
textAreas[i] = new JTextArea(10, 20);
textAreas[i].setEditable(false);
}
JPanel infoPanel = new JPanel(new GridLayout(3, 2));
for (int i = 0; i < 3; i++) {
infoPanel.add(labels[i]);
infoPanel.add(new JScrollPane(textAreas[i]));
}
startButton = new JButton("开始售票");
exitButton = new JButton("退出系统");
startButton.addActionListener(this);
exitButton.addActionListener(this);
JPanel buttonPanel = new JPanel(new FlowLayout());
buttonPanel.add(startButton);
buttonPanel.add(exitButton);
setLayout(new BorderLayout());
add(infoPanel, BorderLayout.CENTER);
add(buttonPanel, BorderLayout.SOUTH);
setSize(500, 400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == startButton) {
// 开始售票
Thread[] threads = new Thread[3];
for (int i = 0; i < 3; i++) {
threads[i] = new TicketSellingThread(i + 1);
threads[i].start();
}
} else if (e.getSource() == exitButton) {
// 退出系统
System.exit(0);
}
}
// 售票线程
private class TicketSellingThread extends Thread {
private int window;
public TicketSellingThread(int window) {
this.window = window;
}
public void run() {
while (true) {
synchronized (TicketSellingSystem.this) {
if (totalTickets == 0) {
// 已售完
JOptionPane.showMessageDialog(TicketSellingSystem.this, "已售完!");
break;
}
if (soldTickets == 100) {
// 售票已经完成
break;
}
// 售票
totalTickets--;
soldTickets++;
textAreas[window - 1].setText("售票窗口" + window + ":已售" + soldTickets + "张,余票" + totalTickets + "张");
}
// 模拟售票过程
try {
Thread.sleep((long) (Math.random() * 1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
new TicketSellingSystem();
}
}
```
在程序中,我们首先定义了三个JLabel和三个JTextArea用来显示售票情况,以及两个JButton分别用来开始售票和退出系统。在开始售票按钮的事件处理方法中,我们创建了三个售票线程,并启动它们。售票线程中,我们使用synchronized关键字控制对售票数据(totalTickets和soldTickets)的访问,保证了线程安全性。同时,我们使用Thread.sleep()方法模拟了售票的时间过程。
注意,本程序中的售票数量和时间都是随机的,您可以根据需要进行调整。此外,本程序中并没有保存售票情况,您可以自行添加相关的数据结构和方法来实现。