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
原创粉丝点击