需要为一个景区实现计算景区门票的程序,已知成年人的门票价格是100元,儿童票打3折,老年票打5折。使用抽象类来为任意多张不同类型的票计算总价。其UML类图如下所示。
本来呢这个题目老师的本意是想让我们理解抽象类和多态的,但是由于最近看了一个星期的狂神的关于GUI编程的视频,并且IDEA在界面组件的拖拽功能上好像不如NetBeans强大(也可能是我学艺不精呀),反正感觉IDEA的组件用着挺难受的,正好自己看了一个星期的视频,还没有什么可以实践的地方,刚好就可以用这个作业来实践一下。所以我写的这个作业80%的心血都在界面上,算是对这一周学习的总结。关于题目本身只是草率了了。没有做很深的研究,并且,我学Java时间很短,可能代码上有一些逻辑上不通,或者表达习惯不好的地方请指正。
- 这是类的结构名称和类图(我感觉想看懂一个代码,这两部分还是挺重要的,所以先放的这两个)
- 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();
}
- 三个子类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;
}
}
- MyJFrame类,继承父类JFrame,并且调用MyPanel类,是程序的开始
package zhh_week_7;
import javax.swing.*;
public class MyJFrame extends JFrame {
public static void main(String[] args) {
new MyJPanel();
}
}
- 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.首先是一个界面-2. 然后是new一些面板
-3. 在面板上添加Label和Text
-4. 然后将每个面板放入到大面板中,不想重复画了,就直接放到界面中了
以上就是面板设计的全部思路了。
- 下面是运行截图(因为设置了,计算之后文本框清0,所以结果截两个图)
8. 弹窗截图
感谢读者朋友,如果有大佬发现错误,欢迎☞出