java售票系统(涉及线程和xml)
来源:互联网 发布:ubuntu系统字体 编辑:程序博客网 时间:2024/06/08 11:34
构建售票场景演示。
(1)通过图形化界面实现功能;
(2)支持手动动态设置总票数(200以上),要对票本身进行定义和描述;
(3)程序运行时,设定有20个售票员同时售票,售票行为采用随机数实现,使多个售票员的售票时间彼此没有规律性;
(4)在程序运行过程中,伴随正在售票,要在用户界面上显示当前剩余票数,以及各售票员已经售出的票数;
(5)在所有票均售出后,要对各个售票员的售票情况进行总结(至少包括售票数量,各次出票时间,票面信息),并按其卖票数量进行排名;
(6)展示的售票情况结果要能够采用文件方式导出并保存在本地,并且支持对该文本的直接打开和查看;文件内容模板请同学们自行设计。推荐采用xml实现。
(7)售票员的个数和单个售票员参数(如ID,名字,…)的设置,要求采用文件导入方式进行配置,导入后,要在界面上显示导入的各个售票员信息;
(8)要保证程序的健壮性。
文件布局:
1.Seller类
implements Comparable 为后面买票人员排序
package ticketdistributor;import java.util.ArrayList;import java.util.List;public class Seller implements Comparable<Seller> { private int id; private String name; public int total_sell; private List<Integer> sell_list ; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getTotal_sell() { return total_sell; } public void setTotal_sell(int total_sell) { this.total_sell += total_sell; } public List<Integer> getSell_list() { return sell_list; } public void setSell_list(List<Integer> sell_list) { this.sell_list = sell_list; } public Seller(int id, String name) { super(); this.id = id; this.name = name; sell_list = new ArrayList<Integer>(); } @Override public String toString() { return "id:"+id+" name:"+name+" total:"+total_sell+" sell_ticket:"+sell_list; } public String getSellInfo() { return "name:"+name+" total:"+total_sell+" sell_ticket:"+sell_list; } @Override public int compareTo(Seller o) { return this.getTotal_sell()>o.getTotal_sell() ? -1:1; }}
2.xml操作类
package ticketdistributor;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerConfigurationException;import javax.xml.transform.TransformerException;import javax.xml.transform.TransformerFactory;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.stream.StreamResult;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.NodeList;import org.xml.sax.SAXException;public class XmlDo { public static void write(Seller[] seller_array,File f) throws ParserConfigurationException, SAXException, IOException, TransformerException { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse(f); Element root = document.getDocumentElement(); System.out.println("xml文件的根节点为:"+root.getNodeName()); NodeList nl = document.getElementsByTagName("SELLER"); System.out.println("结点数"+nl.getLength()); for (int i = 0; i < nl.getLength(); i++) { document.getElementsByTagName("ID") .item(i).getFirstChild().setNodeValue(seller_array[i].getId()+""); document.getElementsByTagName("NAME") .item(i).getFirstChild().setNodeValue(seller_array[i].getName()+""); document.getElementsByTagName("NUMBER") .item(i).getFirstChild().setNodeValue(seller_array[i].getTotal_sell()+""); if(seller_array[i].getSell_list()!=null){ document.getElementsByTagName("SELLERLIST") .item(i).getFirstChild().setNodeValue(seller_array[i].getSell_list().toString()); } } saveXml(document,f); } public static void saveXml(Document document,File f){ TransformerFactory transformerFactory = TransformerFactory.newInstance(); try { Transformer transformer = transformerFactory.newTransformer(); DOMSource domSource = new DOMSource(document); StreamResult streamResult = new StreamResult(new FileOutputStream(f)); transformer.transform(domSource, streamResult); } catch (TransformerConfigurationException e) { e.printStackTrace(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (TransformerException e) { e.printStackTrace(); } } }
3。售票系统显示类
package ticketdistributor;import java.awt.BorderLayout;import java.awt.EventQueue;import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.File;import java.io.IOException;import java.util.ArrayList;import java.util.Arrays;import javax.swing.JButton;import javax.swing.JFileChooser;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JTextArea;import javax.swing.JTextField;import javax.swing.filechooser.FileNameExtensionFilter;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import javax.xml.transform.TransformerException;import org.w3c.dom.Document;import org.w3c.dom.NodeList;import org.xml.sax.SAXException;public class SellSystem extends JFrame implements ActionListener { public int count = 20; private static Seller[] seller_array = null; JPanel center; private JLabel Jticker; private JTextField[] Jticker_Array; private JTextField System_total_ticket; private JButton set_System_total_ticket; private JButton start_sell; private JButton sort_sell; private JButton save_info; public SellSystem() { initSeller(); initLayout(); setActionListenner(); } private void setActionListenner() { set_System_total_ticket.addActionListener(this); } private void initLayout() { Jticker = new JLabel("设置总票数"); System_total_ticket = new JTextField(20); set_System_total_ticket = new JButton("设置"); JPanel north = new JPanel(); north.add(Jticker); north.add(System_total_ticket); north.add(set_System_total_ticket); center= new JPanel(new GridLayout(5, 4)); if (seller_array != null) { Jticker_Array = new JTextField[seller_array.length]; for (int i = 0; i < seller_array.length; i++) { System.out.println(seller_array[i].toString()); Jticker_Array[i] = new JTextField(seller_array[i].toString()); Jticker_Array[i].setText(seller_array[i].toString()); center.add(Jticker_Array[i]); } } JPanel south = new JPanel(); start_sell = new JButton("售票"); sort_sell = new JButton("排序"); save_info = new JButton("保存信息"); start_sell.addActionListener(this); sort_sell.addActionListener(this); save_info.addActionListener(this); south.add(start_sell); south.add(sort_sell); south.add(save_info); add(center, BorderLayout.CENTER); add(north, BorderLayout.NORTH); add(south, BorderLayout.SOUTH); setSize(1200, 600); } private void initSeller() { try { JFileChooser jc = new JFileChooser("."); // 过滤文件 FileNameExtensionFilter filter = new FileNameExtensionFilter("xml", "xml"); jc.setFileFilter(filter); jc.showOpenDialog(null); // 获取文件 File f = jc.getSelectedFile(); if (f != null) { DocumentBuilderFactory factory = DocumentBuilderFactory .newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(f); NodeList nl = doc.getElementsByTagName("SELLER"); System.out.println(nl.getLength()); seller_array = new Seller[nl.getLength()]; for (int i = 0; i < nl.getLength(); i++) { int id = Integer.parseInt(doc.getElementsByTagName("ID") .item(i).getFirstChild().getNodeValue()); String name = doc.getElementsByTagName("NAME").item(i) .getFirstChild().getNodeValue(); seller_array[i] = new Seller(id, name); System.out.println(seller_array[i]); } } } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { SellSystem ss = new SellSystem(); ss.setVisible(true); } @Override public void actionPerformed(ActionEvent e) { if ("设置".equals(e.getActionCommand())) { if (!System_total_ticket.getText().equals("")) count = Integer.parseInt(System_total_ticket.getText()); System.out.println("设置" + count); } if ("售票".equals(e.getActionCommand())) { for(int i=0;i<seller_array.length;i++){ seller_array[i].setSell_list(new ArrayList<Integer>()); seller_array[i].total_sell=0; } myRunnable mr = new myRunnable(); Thread sell_thread = new Thread(mr); sell_thread.start(); } if ("保存信息".equals(e.getActionCommand())) { JFileChooser jc = new JFileChooser("."); // 过滤文件 FileNameExtensionFilter filter = new FileNameExtensionFilter("xml", "xml"); jc.setFileFilter(filter); jc.showOpenDialog(null); File f = jc.getSelectedFile(); try { if(seller_array==null){ System.out.println("seller_array"+"为空"); }else{ XmlDo.write(seller_array,f); } } catch (ParserConfigurationException e1) { e1.printStackTrace(); } catch (SAXException e1) { e1.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } catch (TransformerException e1) { e1.printStackTrace(); } } } class myRunnable implements Runnable { public int index; private boolean flag = true; @Override public void run() { synchronized (this) { while(flag){ index=(int)(Math.random() * 20); if (count > 0) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } if (count > 10) { Seller s = seller_array[index]; int radom = (int) (Math.random() * 10); //除去随机数中的零 if(radom!=0){ s.getSell_list().add(radom); s.setTotal_sell(radom); } System.out.println(); System.out.println(s.getId() + "begins sell" + radom+"total"+s.getTotal_sell()); count -= radom; } else { // 避免随机数过大超过现有票数 Seller s = seller_array[index]; s.getSell_list().add(1); s.setTotal_sell(1); System.out.println(s.getId() + "begins sell" + 1); count--; } System.out.println("剩余票数"+count); } else if (count == 0) { flag = false; System.out.println("售完"); } //用视图线程更新ui并排序 flashUI(); } } } private void flashUI() { EventQueue.invokeLater(new Runnable() { @Override public void run() { System.out.println("排序"); center.removeAll(); if (seller_array != null) { Arrays.sort(seller_array); for (int i = 0; i < seller_array.length; i++) { Jticker_Array[i].setText(seller_array[i].toString()); center.add(Jticker_Array[i]); } } center.updateUI(); center.repaint(); } }); } }}
4xml文件
seller信息xml文件
<?xml version="1.0" encoding="UTF-8"?><RESULT> <SELLER> <ID>0</ID> <NAME>seller0</NAME> <NUMBER>0</NUMBER></SELLER> <SELLER> <ID>1</ID> <NAME>seller1</NAME> <NUMBER>0</NUMBER></SELLER> <SELLER> <ID>2</ID> <NAME>seller2</NAME> <NUMBER>0</NUMBER> </SELLER> <SELLER> <ID>3</ID> <NAME>seller3</NAME> <NUMBER>0</NUMBER> </SELLER> <SELLER> <ID>4</ID> <NAME>seller4</NAME> <NUMBER>0</NUMBER> </SELLER> <SELLER> <ID>5</ID> <NAME>seller5</NAME> <NUMBER>0</NUMBER> </SELLER> <SELLER> <ID>6</ID> <NAME>seller6</NAME> <NUMBER>0</NUMBER> </SELLER> <SELLER> <ID>7</ID> <NAME>seller7</NAME> <NUMBER>0</NUMBER> </SELLER> <SELLER> <ID>8</ID> <NAME>seller8</NAME> <NUMBER>0</NUMBER> </SELLER> <SELLER> <ID>9</ID> <NAME>seller9</NAME> <NUMBER>0</NUMBER> </SELLER> <SELLER> <ID>10</ID> <NAME>seller10</NAME> <NUMBER>0</NUMBER> </SELLER> <SELLER> <ID>11</ID> <NAME>seller11</NAME> <NUMBER>0</NUMBER> </SELLER> <SELLER> <ID>12</ID> <NAME>seller12</NAME> <NUMBER>0</NUMBER> </SELLER> <SELLER> <ID>13</ID> <NAME>seller11</NAME> <NUMBER>0</NUMBER> </SELLER> <SELLER> <ID>14</ID> <NAME>seller14</NAME> <NUMBER>0</NUMBER> </SELLER> <SELLER> <ID>15</ID> <NAME>seller15</NAME> <NUMBER>0</NUMBER> </SELLER> <SELLER> <ID>16</ID> <NAME>seller116</NAME> <NUMBER>0</NUMBER> </SELLER> <SELLER> <ID>17</ID> <NAME>seller17</NAME> <NUMBER>0</NUMBER> </SELLER> <SELLER> <ID>18</ID> <NAME>seller18</NAME> <NUMBER>0</NUMBER> </SELLER> <SELLER> <ID>19</ID> <NAME>seller19</NAME> <NUMBER>0</NUMBER> </SELLER> </RESULT>
保存文件:
<?xml version="1.0" encoding="UTF-8" standalone="no"?><RESULT> <SELLER> <ID>9</ID> <NAME>seller9</NAME> <NUMBER>14</NUMBER> <SELLERLIST>[8, 4, 2]</SELLERLIST></SELLER> <SELLER> <ID>5</ID> <NAME>seller5</NAME> <NUMBER>12</NUMBER> <SELLERLIST>[7, 5]</SELLERLIST></SELLER> <SELLER> <ID>14</ID> <NAME>seller14</NAME> <NUMBER>10</NUMBER> <SELLERLIST>[2, 3, 5]</SELLERLIST></SELLER> <SELLER> <ID>0</ID> <NAME>seller0</NAME> <NUMBER>7</NUMBER> <SELLERLIST>[7]</SELLERLIST></SELLER> <SELLER> <ID>7</ID> <NAME>seller7</NAME> <NUMBER>5</NUMBER> <SELLERLIST>[5]</SELLERLIST></SELLER> <SELLER> <ID>8</ID> <NAME>seller8</NAME> <NUMBER>4</NUMBER> <SELLERLIST>[4]</SELLERLIST></SELLER> <SELLER> <ID>16</ID> <NAME>seller116</NAME> <NUMBER>4</NUMBER> <SELLERLIST>[3, 1]</SELLERLIST></SELLER> <SELLER> <ID>6</ID> <NAME>seller6</NAME> <NUMBER>3</NUMBER> <SELLERLIST>[3]</SELLERLIST></SELLER> <SELLER> <ID>11</ID> <NAME>seller11</NAME> <NUMBER>3</NUMBER> <SELLERLIST>[1, 2]</SELLERLIST></SELLER> <SELLER> <ID>1</ID> <NAME>seller1</NAME> <NUMBER>3</NUMBER> <SELLERLIST>[3]</SELLERLIST></SELLER> <SELLER> <ID>13</ID> <NAME>seller11</NAME> <NUMBER>2</NUMBER> <SELLERLIST>[2]</SELLERLIST></SELLER> <SELLER> <ID>3</ID> <NAME>seller3</NAME> <NUMBER>2</NUMBER> <SELLERLIST>[1, 1]</SELLERLIST></SELLER> <SELLER> <ID>4</ID> <NAME>seller4</NAME> <NUMBER>0</NUMBER> <SELLERLIST>[]</SELLERLIST></SELLER> <SELLER> <ID>2</ID> <NAME>seller2</NAME> <NUMBER>0</NUMBER> <SELLERLIST>[]</SELLERLIST></SELLER> <SELLER> <ID>10</ID> <NAME>seller10</NAME> <NUMBER>0</NUMBER> <SELLERLIST>[]</SELLERLIST></SELLER> <SELLER> <ID>12</ID> <NAME>seller12</NAME> <NUMBER>0</NUMBER> <SELLERLIST>[]</SELLERLIST></SELLER> <SELLER> <ID>15</ID> <NAME>seller15</NAME> <NUMBER>0</NUMBER> <SELLERLIST>[]</SELLERLIST></SELLER> <SELLER> <ID>17</ID> <NAME>seller17</NAME> <NUMBER>0</NUMBER> <SELLERLIST>[]</SELLERLIST></SELLER> <SELLER> <ID>18</ID> <NAME>seller18</NAME> <NUMBER>0</NUMBER> <SELLERLIST>[]</SELLERLIST></SELLER> <SELLER> <ID>19</ID> <NAME>seller19</NAME> <NUMBER>0</NUMBER> <SELLERLIST>[]</SELLERLIST></SELLER> </RESULT>
0 0
- java售票系统(涉及线程和xml)
- Java线程初步了解2-售票系统
- Java多线程4—线程同步问题+火车票售票系统
- Java多线程4—线程同步问题+火车票售票系统
- java火车站售票系统之多线程并发访问
- 线程死锁(由哲学家就餐到售票系统)
- C++多线程操作(火车售票系统线程同步)
- Java线程学习之一---售票
- java线程关于售票问题
- Java多线程(四) Thread和Runnable之区别(售票系统)
- java线程并发之售票问题(上)
- java --thread--火车票售票系统
- java 多线程模拟售票系统
- 线程(售票小程序)
- 使用java多线程模拟火车售票系统(1)
- 使用java多线程模拟火车售票系统(2)
- 电影售票系统(1)
- 电影售票系统(2)
- sdut oj面向对象程序设计上机练习十二(运算符重载)
- python __getattr__ 与 __call__
- hdu 5805 D - NanoApe Loves Sequence 记录最大值dp
- apache 伪静态设置
- 第十五周oj训练——判断字符串是否为回文(2802)
- java售票系统(涉及线程和xml)
- Spring 5.0.0框架介绍_中文版_3.9
- 20161210公开课_C与C++区别
- java 获得客户端ip
- MPLS 配置笔记
- 大整数相乘——链表和数组实现
- AngularJS简单入门
- 欢迎使用CSDN-markdown编辑器
- Android学习:EditText用法