import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
// 主窗口类
class MainFrame extends JFrame {
private JPanel mainPanel;
private JMenuBar menuBar;
private JMenu operationMenu, helpMenu;
private JMenuItem lineItem, stationItem, ticketNumItem, paymentItem;
private JMenuItem guideItem, aboutItem;
private JPopupMenu popupMenu;
private JMenuItem restartItem, exitItem;
public MainFrame() {
setTitle("地铁自动售票机");
setSize(1024, 768);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainPanel = new JPanel();
mainPanel.setBackground(Color.LIGHT_GRAY);
JLabel welcomeLabel = new JLabel("欢迎使用地铁自动售票机,请选择线路");
mainPanel.add(welcomeLabel);
add(mainPanel);
menuBar = new JMenuBar();
operationMenu = new JMenu("操作");
helpMenu = new JMenu("帮助");
lineItem = new JMenuItem("线路选择");
stationItem = new JMenuItem("站点选择");
ticketNumItem = new JMenuItem("票数输入");
paymentItem = new JMenuItem("支付确认");
guideItem = new JMenuItem("操作指南");
aboutItem = new JMenuItem("关于我们");
operationMenu.add(lineItem);
operationMenu.add(stationItem);
operationMenu.add(ticketNumItem);
operationMenu.add(paymentItem);
helpMenu.add(guideItem);
helpMenu.add(aboutItem);
menuBar.add(operationMenu);
menuBar.add(helpMenu);
setJMenuBar(menuBar);
lineItem.addActionListener(e -> new LineDialog(this).setVisible(true));
stationItem.addActionListener(e -> new StationDialog(this, "1号线").setVisible(true));
ticketNumItem.addActionListener(e -> new TicketNumDialog(this).setVisible(true));
paymentItem.addActionListener(e -> new PaymentDialog(this, 1, 5).setVisible(true));
guideItem.addActionListener(e -> JOptionPane.showMessageDialog(this, "操作指南:先选择线路,再选择站点,输入票数,最后进行支付。", "操作指南", JOptionPane.INFORMATION_MESSAGE));
aboutItem.addActionListener(e -> JOptionPane.showMessageDialog(this, "这是一个地铁自动售票机系统。", "关于我们", JOptionPane.INFORMATION_MESSAGE));
popupMenu = new JPopupMenu();
restartItem = new JMenuItem("重新开始");
exitItem = new JMenuItem("退出");
popupMenu.add(restartItem);
popupMenu.add(exitItem);
mainPanel.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON3) {
popupMenu.show(mainPanel, e.getX(), e.getY());
}
}
});
restartItem.addActionListener(e -> {
// 重置操作流程
JOptionPane.showMessageDialog(this, "操作已重置,请重新开始。", "重新开始", JOptionPane.INFORMATION_MESSAGE);
});
exitItem.addActionListener(e -> System.exit(0));
}
}
// 线路选择对话框
class LineDialog extends JDialog {
private JButton line1Button, line2Button;
private JButton confirmButton, cancelButton;
public LineDialog(JFrame parent) {
super(parent, "选择线路", true);
setSize(300, 200);
JPanel panel = new JPanel();
line1Button = new JButton("1号线");
line2Button = new JButton("2号线");
confirmButton = new JButton("确定");
cancelButton = new JButton("取消");
panel.add(line1Button);
panel.add(line2Button);
panel.add(confirmButton);
panel.add(cancelButton);
add(panel);
confirmButton.addActionListener(e -> {
new StationDialog(parent, "1号线").setVisible(true);
dispose();
});
cancelButton.addActionListener(e -> dispose());
}
}
// 站点选择对话框
class StationDialog extends JDialog {
private JList<String> stationList;
private JButton prevButton, nextButton;
public StationDialog(JFrame parent, String line) {
super(parent, "选择站点", true);
setSize(300, 200);
DefaultListModel<String> listModel = new DefaultListModel<>();
if (line.equals("1号线")) {
listModel.addElement("站A");
listModel.addElement("站B");
listModel.addElement("站C");
}
stationList = new JList<>(listModel);
prevButton = new JButton("上一步");
nextButton = new JButton("下一步");
JPanel panel = new JPanel();
panel.add(new JScrollPane(stationList));
panel.add(prevButton);
panel.add(nextButton);
add(panel);
prevButton.addActionListener(e -> {
new LineDialog(parent).setVisible(true);
dispose();
});
nextButton.addActionListener(e -> {
new TicketNumDialog(parent).setVisible(true);
dispose();
});
}
}
// 票数输入对话框
class TicketNumDialog extends JDialog {
private JLabel ticketLabel;
private JTextField ticketField;
private JButton confirmButton, resetButton;
public TicketNumDialog(JFrame parent) {
super(parent, "输入票数", true);
setSize(300, 200);
ticketLabel = new JLabel("请输入票数(1 - 10张)");
ticketField = new JTextField(5);
confirmButton = new JButton("确认");
resetButton = new JButton("重置");
JPanel panel = new JPanel();
panel.add(ticketLabel);
panel.add(ticketField);
panel.add(confirmButton);
panel.add(resetButton);
add(panel);
confirmButton.addActionListener(e -> {
try {
int num = Integer.parseInt(ticketField.getText());
if (num >= 1 && num <= 10) {
new PaymentDialog(parent, num, 5).setVisible(true);
dispose();
} else {
JOptionPane.showMessageDialog(this, "票数输入无效,请输入1 - 10之间的数字。", "错误提示", JOptionPane.ERROR_MESSAGE);
}
} catch (NumberFormatException ex) {
JOptionPane.showMessageDialog(this, "输入无效,请输入有效的数字。", "错误提示", JOptionPane.ERROR_MESSAGE);
}
});
resetButton.addActionListener(e -> ticketField.setText(""));
}
}
// 支付确认对话框
class PaymentDialog extends JDialog {
private JLabel amountLabel;
private JButton cashButton, scanButton;
private JButton payButton, cancelPayButton;
public PaymentDialog(JFrame parent, int ticketNum, int price) {
super(parent, "支付确认", true);
setSize(300, 200);
int totalAmount = ticketNum * price;
amountLabel = new JLabel("总金额:" + totalAmount + " 元");
cashButton = new JButton("现金支付");
scanButton = new JButton("扫码支付");
payButton = new JButton("支付完成");
cancelPayButton = new JButton("取消支付");
JPanel panel = new JPanel();
panel.add(amountLabel);
panel.add(cashButton);
panel.add(scanButton);
panel.add(payButton);
panel.add(cancelPayButton);
add(panel);
payButton.addActionListener(e -> {
new ChangeDialog(parent, totalAmount, 100).setVisible(true);
dispose();
});
cancelPayButton.addActionListener(e -> dispose());
}
}
// 找零提示对话框
class ChangeDialog extends JDialog {
private JLabel changeLabel;
private JButton confirmButton;
public ChangeDialog(JFrame parent, int totalAmount, int paidAmount) {
super(parent, "找零提示", true);
setSize(300, 200);
int change = paidAmount - totalAmount;
changeLabel = new JLabel("找零金额:" + change + " 元");
confirmButton = new JButton("确定");
JPanel panel = new JPanel();
panel.add(changeLabel);
panel.add(confirmButton);
add(panel);
confirmButton.addActionListener(e -> {
dispose();
// 返回主窗口
});
}
}
public class MetroTicketMachineApp {
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
MainFrame mainFrame = new MainFrame();
mainFrame.setVisible(true);
});
}
}
将支付方式改为输入金额然后找回
最新发布