zoukankan      html  css  js  c++  java
  • 使用Java带你打造一款简单的外卖系统

    【一、项目背景】

    随着互联网时代的快速发展,便捷人民的生活,提高生活质量,外卖系统应运而生。

    人们也喜欢享受着“足不出户,美食到家”的待遇,促使网上订餐行业快速发展。

    【二、项目目标】

    1. 设计一款应用程序-外卖系统,有文字和图片显示,通过选择一种或多种食物,每种食物可以选择一份或多份,点击结算后,进行总价的统计。

    2. 实现标题文字滚动和颜色定时变化。

    3. 实现消费多少钱免配送费以及消费多少钱满减。

    【三、项目实施】

    使用eclipse软件开发,先上效果图,如下图所示。

    image

    可以看到在界面上有文字和图片显示,通过选择一种或多种食物,每种食物可以选择一份或多份,结算功能,标题文字滚动加颜色变化的功能。

    接下来,小编带大家进行具体的实现,具体的实现步骤如下。

    【四、实现步骤】

    一、首先实现外卖系统购物车的窗口

    public static void main(String[] args) {
        // TODO Auto-generated method stub
            Takeout t = new Takeout();
            t.setTitle("饶洋外卖");
            t.setSize(720,550);
            t.setVisible(true);
    }
    

    使用new关键字创建Takeout类;

    setTitle表示设置界面的标题;

    setSize(宽,高)表示窗体大小;

    setVisible(true或false)表示窗体是否可见;

    二、添加文字实现

    1. 使用到组件有JPanel、JLabel;

    2. 添加Takeout类的成员变量;

    public class Takeout extends JFrame {
      //成员变量
          private JPanel panel01 = new JPanel();
    private JLabel label01 = new JLabel("欢迎来到饶洋外卖系统!");
    

    3. 添加文字说明;

    Takeout类构造函数:

    Takeout(){
          label01.setFont(new Font("黑体",Font.PLAIN,30));
          label01.setForeground(Color.BLUE);
           panel01.add(label01);
          panel01.setOpaque(false);//设置透明
          this.setLayout(new BorderLayout());
          this.add(panel01,BorderLayout.NORTH);
          this.getContentPane().setBackground(c);
    

    4. 文字(label01)设置显示效果

    1. setFont(newFont(String 字体,int 风格,int 字号));

    字体:TimesRoman, Courier, Arial等; 风格:三个常量 lFont.PLAIN, Font.BOLD, Font.ITALIC; 字号:字的大小(磅数);

    1. setForegound设置前景色;

    2. setOpaque设置控件透明(ture或false);

    3. 布局管理器之BorderLayout(边界布局);

    边界布局管理器把容器的的布局分为五个位置:CENTER、EAST、WEST、NORTH、SOUTH。依次相应为:上北(NORTH)、下南(SOUTH)、左西(WEST)、右东(EAST),中(CENTER)。

    5. 边界布局特征

    1. 能够把组件放在这五个位置的随意一个,假设未指定位置,则缺省的位置是CENTER。

    2. 南、北位置控件各占领一行,控件宽度将自己主动布满整行。东、西和中间位置占领一行;若东、西、南、北位置无控件,则中间控件将自己主动布满整个屏幕。若东、西、南、北位置中不管哪个位置没有控件,则中间位置控件将自己主动占领没有控件的位置。

    3. 它是窗体、框架的内容窗格和对话框等的缺省布局。

    6. getContentPane.setBackground(c)初始化一个容器,设置背景RGB颜色需要在成员变量定义。

    private Color c = new Color(197,228,251);
    

    三、添加食物文字、数量(按钮)和图片

    需要添加JPanel、 JCheckBox、 JButton 、JLabel等。

    1. 添加Takeout类的成员变量

    private JPanel panel02 = new JPanel();
    private JCheckBox check[] = new JCheckBox[9];//文字(多选框)
    private JButton amount[] = new JButton[9];//数量(按钮)
    private JLabel food[] = new JLabel[9];//食物图片
    private int num[]=new int[9];//数量数组
    

    2. 在Takeout类的构造函数设置组件的属性

    参考代码

    Takeout(){
      ……
        check[0]=new JCheckBox("  雪糕    3.0元",false);
        check[1]=new JCheckBox("  薯条    6.0元",false);
        check[2]=new JCheckBox("爆米花  8.0元",false);
        check[3]=new JCheckBox("  热狗  10.0元",false);
        check[4]=new JCheckBox("汉堡包11.0元",false);
        check[5]=new JCheckBox("巨无霸16.0元",false);
        check[6]=new JCheckBox("  可乐    6.0元",false);
        check[7]=new JCheckBox("  果汁    8.0元",false);
    check[8]=new JCheckBox("  啤酒    6.0元",false);
    for(int i=0;i<9;i++){
          amount[i]=new JButton("1份");
          food[i]=new JLabel(new         ImageIcon("image//food"+(i+1)+".jpg"));
          check[i].setOpaque(false);
          panel02.add(check[i]);
          panel02.add(amount[i]);
          panel02.add(food[i]);
          num[i]=1;
    
          amount[i].addActionListener(my);
    
          }
          panel02.setOpaque(false);
        this.add(panel02,BorderLayout.CENTER);
    

    四、添加状态信息:JTextArea等

    1. 添加Takeout类的成员变量

    private JTextArea list=new JTextArea(10,20);
    private String str="";
    

    2. 在Takeout类的构造函数设置组件的属性

    参考代码

    Takeout(){
      ……
    list.setText("状态:未选餐!");
          list.setBackground(c);
        panel02.add(list);
    }
    

    五、添加按钮和总价框:JPanel、 JButton、JLabel、JTextField等

    1. 添加Takeout类的成员变量

    private JPanel panel03=new JPanel();
    private JButton btn_ok = new JButton("结算");
    private JButton btn_cancel = new JButton("清空");
    private JLabel label02 = new JLabel("总价:");
              private double a[]=new double[9];//食物单价
         private double total=0;//总价
    

    2. 在Takeout类的构造函数设置组件的属性

    参考代码

    Takeout(){
      ……
        panel03.add(btn_ok);
        panel03.add(btn_cancel);
        panel03.add(label02);
        panel03.add(text01);
        panel03.add(label03);
        this.add(panel03,BorderLayout.SOUTH);
        panel03.setOpaque(false);
    
        a[0]=3.0;
        a[1]=6.0;
        a[2]=8.0;
        a[3]=10.0;
        a[4]=11.0;
        a[5]=16.0;
        a[6]=6.0;
        a[7]=8.0;
        a[8]=6.0;
    

    六、事件处理

    定义事件处理类,实现事件监听器

    1. 在成员变量添加

    private MyListener my = new MyListener();
    

    2. 在Takeout()内添加

    btn_ok.addActionListener(my);
    btn_cancel.addActionListener(my);
    

    3. 添加事件监听器MyListener(自己命名)

    private class MyListener implements ActionListener{
    
        @Override
        public void actionPerformed(ActionEvent e) {
          // TODO Auto-generated method stub
          //添加事件处理代码
                for(int i=0;i<9;i++){
                  if(e.getSource()==amount[i]){
                    if(num[i]<9)
                      num[i]++;
                    else
                      num[i]=0;
                    amount[i].setText(num[i]+"份");
                  }
                }
                if(e.getSource()==btn_ok){
                  total=0;
                  str="";
                  for(int i=0;i<9;i++){
                    if(check[i].isSelected()==true){
                      total=total+a[i]*num[i];
                      str=str+check[i].getText()+"    "+amount[i].getText()+"
    ";
                    }
                  }              
                  text01.setText(""+total);
                  list.setText("状态:已选餐:
    "+str+"
    ");
                }
    

    以上e.getSource()==btn_ok代码完成结算功能。

    if(e.getSource()==btn_cancel){
                  for(int i=0;i<9;i++){
                    check[i].setSelected(false);
                    amount[i].setSelected(false);
                    num[i]=1;
                    amount[i].setText(num[i]+"份");
                  }
                  total=0;
                  str="";
                  text01.setText(""+total);
                  list.setText("状态:未选餐!");
    
                  label03.setText("满30免费配送,满100立减10");
                }
    

    以上e.getSource()==btn_cancel代码完成清空功能。

    【五、思考题1】

    现在外卖系统商家因业务需求,每一订单需要配送费5元,在活动期间,购满30元免配送费,满100元立减10元,程序应如何修改?

    1. 在成员变量添加以下代码。

    private final int FEE=5;//配送费
    private JLabel label03 = new JLabel("满30免费配送,满100立减10");
    

    2. 在Takeout()类构造函数中if(e.getSource()==btn_ok)添加以下的代码。

    if(total<30){
                    label03.setText("还差"+(30-total)+"就免费配送,还差"+(100-total)+"就满100减10");
                    total=total+FEE;
                    str=str+"配送费   5元";
                  }else if(total<100){//免费配送,不参与满100-10
                    label03.setText("免费配送,还差"+(100-total)+"就满100减10");
                  }else{
                    label03.setText("免费配送,已参与满100减10,"+(total)+"-10");
                    total=total-FEE-FEE;
                  }
    

    【六、思考题2】

    实现“欢迎来到饶洋外卖系统!”文字滚动和颜色定时变化。程序应如何修改?

    1. 在成员变量添加以下代码。

    private Color color[]=new Color[]{Color.BLACK,Color.RED,
             Color.BLUE,Color.LIGHT_GRAY,
                 Color.YELLOW,Color.GREEN,
                 Color.MAGENTA   
         };
         private Timer timer;//定时器
         private int colorIndex=0;//当前颜色的序号
    

    2. 在Takeout()类构造函数中if(e.getSource()==btn_ok)添加以下的代码。

    Takeout(){
    .....
    添加timer=new Timer(500,new TimerListener());
        //定时的时间间隔(单位ms),定时器监听器(要做的事情)
        timer.start();//启动定时器
    }
    

    3. 实现这个TimerListener()函数。

    class TimerListener implements ActionListener{//定时器监听器
    
      @Override
      public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        //定时时间到了,要做的事情:
        colorIndex++;// 0 1 2 3 4 5 6 7%7=0  8%7=1 9%7=2
        label01.setForeground(color[colorIndex/4 % color.length]);
    
          String temp=label01.getText();
          label01.setText( temp.substring(1,temp.length())+temp.substring(0,1));
          //substring(i,j)截取字符串从序号i(包含)到序号j(不包含) i ~ j-1
      }    
    }
    

    以上代码可以实现文字的滚动和颜色变化。

    这个项目主要是用Java Swing图形界面开发,Swing包括图形用户界面器件,还有Java中为我们提供了Timer来实现定时任务,最主要涉及到了两个类:Timer和TimerTask。

    【七、总结】

    1. 主要介绍了JPanel、 JCheckBox、 JLabel、 JButton、 JTextField等组件的基本使用,背景颜色的添加,图片图标的设置,以及相应的事件处理。

    2.事件处理函数的添加,难点是运用理解构造函数、内部类的创建。

    3. 如果需要本文源码,请在公众号后台回复“外卖系统”四个字获取。

    看完本文有收获?请转发分享给更多的人

    IT共享之家

    IT共享之家.jpg

    想学习更多Python网络爬虫与数据挖掘知识,可前往专业网站:http://pdcfighting.com/

    想学习更多Python网络爬虫与数据挖掘知识,可前往专业网站:http://pdcfighting.com/

  • 相关阅读:
    Java RunTime Environment (JRE) or Java Development Kit (JDK) must be available in order to run Eclipse. ......
    UVA 1597 Searching the Web
    UVA 1596 Bug Hunt
    UVA 230 Borrowers
    UVA 221 Urban Elevations
    UVA 814 The Letter Carrier's Rounds
    UVA 207 PGA Tour Prize Money
    UVA 1592 Database
    UVA 540 Team Queue
    UVA 12096 The SetStack Computer
  • 原文地址:https://www.cnblogs.com/dcpeng/p/13332752.html
Copyright © 2011-2022 走看看