Java学习——门票计费程序

需要为一个景区实现计算景区门票的程序,已知成年人的门票价格是100元,儿童票打3折,老年票打5折。使用抽象类来为任意多张不同类型的票计算总价。其UML类图如下所示。
在这里插入图片描述本来呢这个题目老师的本意是想让我们理解抽象类和多态的,但是由于最近看了一个星期的狂神的关于GUI编程的视频,并且IDEA在界面组件的拖拽功能上好像不如NetBeans强大(也可能是我学艺不精呀),反正感觉IDEA的组件用着挺难受的,正好自己看了一个星期的视频,还没有什么可以实践的地方,刚好就可以用这个作业来实践一下。所以我写的这个作业80%的心血都在界面上,算是对这一周学习的总结。关于题目本身只是草率了了。没有做很深的研究,并且,我学Java时间很短,可能代码上有一些逻辑上不通,或者表达习惯不好的地方请指正。

  1. 这是类的结构名称和类图(我感觉想看懂一个代码,这两部分还是挺重要的,所以先放的这两个)
    在这里插入图片描述

在这里插入图片描述

  1. Ticket类(ChildTicket类、OldTicket类、YongTiclek类的父类,抽象类,包含抽象方法SinglePrice()在子类中实现)
package zhh_week_7;

public  abstract class Ticket {
    public float price;

    public Ticket() {
    }
    public Ticket(float price) {
        this.price = price;
    }

    public float getPrice() {
        return price;
    }

    public void setPrice(float price) {
        this.price = price;
    }
    public abstract float singlePrice();
}
  1. 三个子类ChildTicet、OldTicket和YongTicket
package zhh_week_7;

public  class ChildTicket extends Ticket{

   public ChildTicket() {
   }

   public ChildTicket(float price) {
       this.price=price;
   }

   @Override
   public float singlePrice() {
       return 0.3f*this.price;
   }
}
package zhh_week_7;

public  class OldTicket extends Ticket{

    public OldTicket() {
    }

    public OldTicket(float price) {
        this.price=price;
    }

    @Override
    public float singlePrice() {
        return 0.5f*this.price;
    }
}
package zhh_week_7;

public  class YongTicket extends Ticket {

    public YongTicket() {
    }

    public YongTicket(float price) {
        this.price=price;
    }

    @Override
    public float singlePrice() {
        return this.price*1.0f;
    }
}
  1. MyJFrame类,继承父类JFrame,并且调用MyPanel类,是程序的开始
package zhh_week_7;

import javax.swing.*;

public class MyJFrame extends JFrame {
    public static void main(String[] args) {
        new MyJPanel();
    }
}
  1. MyPanel类界面的设计,以及计算都包含在这里
package zhh_week_7;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class MyJPanel extends JPanel{
    static float sum=0f;
    MyButtonListener myButtonListener=null;
    public MyJPanel(){
        JFrame jFrame=new JFrame("欢迎使用购票系统");			//界面标题
        jFrame.setBounds(100,100,500,500);		//设置界面大小

        jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);		//增加右上角的X号可关闭功能

        JPanel panel=new JPanel(new GridLayout(10,1));				//new 一个大的面板,在上面放小的面板
        JPanel panel1=new JPanel(new FlowLayout());					//6个面板分别代表一行
        JPanel panel2=new JPanel(new FlowLayout());
        JPanel panel3=new JPanel(new FlowLayout());
        JPanel panel4=new JPanel(new FlowLayout());
        JPanel panel5=new JPanel(new FlowLayout());
        JPanel panel6=new JPanel(new FlowLayout());
																	//4个文本框
        TextField textField1 = new TextField("100",20);			//票价文本框				
        TextField textField2 = new TextField("0",10);				//成人票多少张
        TextField textField3 = new TextField("0",10);			//老人票多少张
        TextField textField4 = new TextField("0",10);			//小孩票多少张
        JLabel jLabel=new JLabel(""+sum);						//设置初始票价

        JButton jButton=new JButton("计算");					//new 一个按钮
        myButtonListener=new MyButtonListener(textField1,textField2,textField3,textField4);	//将文本框的内容传到鼠标单击事件
        jButton.addActionListener(new ActionListener() {		//鼠标点击按钮事件
            @Override
            public void actionPerformed(ActionEvent e) {
                sum=myButtonListener.actionPerformed(e);
                textField2.setText("0");				//计算后将文本框设置为0,防止重复计算
                textField3.setText("0");
                textField4.setText("0");

                jLabel.setText(String.format("%.2f",sum ));	//保证精度,100*3*0.3不知道为啥会多出来0.000001
                panel.add(panel5);					//将面板5放到大面板上
                panel.add(panel6);					//同上
                jFrame.add(panel);					//将大面板放到界面上,不然无法显示
                jFrame.setVisible(true);			//显示界面
            }
        });

        JButton jButton2=new JButton("计费规则");
        jButton2.addActionListener(new ActionListener() {		//增加一个弹窗事件
            @Override
            public void actionPerformed(ActionEvent e) {			//点击按钮事件
                new MyDialog();
            }
        });
        panel.add(new JPanel());		//在最上面增加一行美化
			//第一个面板
        panel1.add(new JLabel("门票标准单价:"));
        panel1.add(textField1);
        panel1.add(new JLabel(""));
        panel.add(panel1);
			//第二个面板
        panel2.add(new JLabel("成人票:"));
        panel2.add(textField2);
        panel2.add(new JLabel("   张"));
        panel.add(panel2);
			//第三个面板
        panel3.add(new JLabel("老年票:"));
        panel3.add(textField3);
        panel3.add(new JLabel("   张"));
        panel.add(panel3);
			//第四个面板
        panel4.add(new JLabel("儿童票:"));
        panel4.add(textField4);
        panel4.add(new JLabel("   张"));
        panel.add(panel4);
			//第五个面板
        panel5.add(new JLabel("总价:"));
        panel5.add(jLabel);
        panel.add(panel5);
			//第六个面板
        panel6.add(jButton);
        panel6.add(jButton2);
        panel.add(panel6);
			//大面板放入界面
        jFrame.add(panel);
        jFrame.setVisible(true);
    }
}
class MyDialog extends JDialog{		//弹窗事件
    public MyDialog(){
        setTitle("计费规则");
        setSize(600,300);			//弹窗大小
        Container container = getContentPane();		//new一个container容器

        JButton jb1 = new JButton("1:成人票全价");		//new 一个按钮
        jb1.setBounds(200, 50, 200, 30);				//设置按钮的大小和容器上的位置
        container.add(jb1);								//按钮放入容器

        JButton jb2 = new JButton("2:老人票8折");	//同上
        jb2.setBounds(200, 100, 200, 30);
        container.add(jb2);

        JButton jb3 = new JButton("3:儿童票5折");	//同上
        jb3.setBounds(200, 150, 200, 30);
        container.add(jb3);

        setLayout(null);
        setVisible(true);
    }
}
class MyButtonListener {
    private TextField num1, num2, num3, num4;
    static float sum;
    public MyButtonListener(TextField num1, TextField num2, TextField num3, TextField num4) {
        this.num1 = num1;		//同下  获取文本
        this.num2 = num2;
        this.num3 = num3;
        this.num4 = num4;
    }
    public float actionPerformed(ActionEvent e) {

        float n1 = (float) Double.parseDouble(num1.getText());		//同下   将文本转化为数据
        int n2 = Integer.parseInt(num2.getText());
        int n3 = Integer.parseInt(num3.getText());
        int n4 = Integer.parseInt(num4.getText());

        YongTicket yt=new YongTicket(n1);
        OldTicket ot=new OldTicket(n1);
        ChildTicket ct=new ChildTicket(n1);
        sum=0f;
        sum+= n2 *yt.singlePrice()+n3*ot.singlePrice()+n4*ct.singlePrice();		//计算总价
        //System.out.println("sum="+sum);
        return sum;						//返回总价
    }
}
  1. 下面是关于界面设计的思路
    -1.首先是一个界面在这里插入图片描述-2. 然后是new一些面板在这里插入图片描述-3. 在面板上添加Label和Text
    在这里插入图片描述-4. 然后将每个面板放入到大面板中,不想重复画了,就直接放到界面中了在这里插入图片描述以上就是面板设计的全部思路了。
  2. 下面是运行截图(因为设置了,计算之后文本框清0,所以结果截两个图)
    在这里插入图片描述
    在这里插入图片描述8. 弹窗截图

在这里插入图片描述
感谢读者朋友,如果有大佬发现错误,欢迎☞出

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BayMin0520

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值