java编写一个图形界面的火车票售票程序,有三个窗口用来显示售票及余票信息,两个按钮,分别为 开始售票 和 退出系统 点击开始售票按钮 三个窗口同时进行售票 票售完时 弹出消息框 提示已售完 点击 退出系统按钮 系统退,三个窗口区域 用的是 TextArea 并设置其为只读
时间: 2024-02-18 21:05:57 浏览: 27
好的,这是一个经典的Java GUI程序,我们可以使用Swing库来实现。下面是一个简单的实现:
```java
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class TicketSystem extends JFrame implements ActionListener {
private JTextArea area1, area2, area3;
private JButton startButton, exitButton;
private int tickets = 100; // 一共100张票
public TicketSystem() {
setTitle("火车票售票系统");
setSize(800, 400);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 初始化三个TextArea
area1 = new JTextArea("窗口1:剩余票数100张\n", 10, 20);
area2 = new JTextArea("窗口2:剩余票数100张\n", 10, 20);
area3 = new JTextArea("窗口3:剩余票数100张\n", 10, 20);
area1.setEditable(false);
area2.setEditable(false);
area3.setEditable(false);
// 初始化两个按钮
startButton = new JButton("开始售票");
exitButton = new JButton("退出系统");
startButton.addActionListener(this);
exitButton.addActionListener(this);
// 将TextArea和按钮添加到窗口中
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(1, 3));
panel.add(area1);
panel.add(area2);
panel.add(area3);
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new FlowLayout());
buttonPanel.add(startButton);
buttonPanel.add(exitButton);
Container contentPane = getContentPane();
contentPane.setLayout(new BorderLayout());
contentPane.add(panel, BorderLayout.CENTER);
contentPane.add(buttonPanel, BorderLayout.SOUTH);
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == startButton) {
// 开始售票
new Thread(new TicketSeller(area1)).start();
new Thread(new TicketSeller(area2)).start();
new Thread(new TicketSeller(area3)).start();
} else if (e.getSource() == exitButton) {
// 退出系统
System.exit(0);
}
}
private class TicketSeller implements Runnable {
private JTextArea area;
public TicketSeller(JTextArea area) {
this.area = area;
}
public void run() {
while (tickets > 0) {
synchronized (TicketSystem.this) {
if (tickets > 0) {
tickets--;
area.setText("剩余票数" + tickets + "张\n");
}
}
try {
Thread.sleep(50); // 模拟售票过程
} catch (InterruptedException e) {
e.printStackTrace();
}
}
JOptionPane.showMessageDialog(null, "票已售完!", "提示", JOptionPane.INFORMATION_MESSAGE);
}
}
public static void main(String[] args) {
TicketSystem system = new TicketSystem();
system.setVisible(true);
}
}
```
上面的代码中,我们定义了一个`TicketSystem`类,继承自`JFrame`,表示整个窗口。在窗口中,我们创建了三个`JTextArea`和两个`JButton`,并将它们添加到窗口中。
当点击“开始售票”按钮时,程序会创建三个线程,每个线程对应一个售票窗口。售票的过程就是在一个循环中不断减少票数,并且更新对应窗口的TextArea。当票数为0时,程序会弹出一个消息框,提示已售完。
当点击“退出系统”按钮时,程序会直接退出。
注意,在售票过程中,我们使用了`synchronized`来保证线程安全,确保票数不会出现负数。同时,我们还使用了`Thread.sleep`来模拟售票的过程。
最后,我们在`main`方法中创建了一个`TicketSystem`实例,并将其设置为可见。