0

I am currently developing a booking system as a task for my degree. I need the seating plan to be "saved/stored" for each showing time (radio buttons), so that e.g. If I book 2 tickets at 13:00, I can also book 2 tickets on the same spot for 15:00. What is the best way of doing this?

PS: I'm not making use of a database and I would prefer not to; due to task's requirements.

Here's my code, please run it if you can.

// CM1203 Fundamentals of Computing with Java; Second Assignement.
// Walter Carvalho - C1001984; 2012.
// Cardiff University

// Load Libraries
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import java.text.*;

public class cinemaSystem extends JFrame implements ActionListener {
    // Global Variables
    boolean lselected, rselected, mselected;
    double chargeDue;
    int a, b, c;
    static Ticket oapticket, childticket, adultticket;
    JFrame frame = new JFrame(); // Creates JFrame
    JLabel title, lchild, ladult, loap, ltotalprice, time;
    JTextField child, adult, oap, totalprice;
    JButton submit;
    JRadioButton time1, time2, time3, time4, time5; // Radio Butons
    JToggleButton l[][], m[][], r[][]; // Names grid of JButtons
    JPanel panel1, panel2, panel3, panel4, panel5, panel6;
    ArrayList<String> seatsAvailable = new ArrayList<String>();
    ArrayList<String> coupon = new ArrayList<String>();

    // Constructor
    public cinemaSystem(){

            title = new JLabel("Cinema Booking System");
            title.setFont(new Font("Helvetica", Font.BOLD, 30));
            title.setLocation(12,5);
            title.setSize(600, 60);

            frame.setLayout(null); // Setting Grid Layout
            // panel1.setLayout(new GridLayout(seat,row));
            l = new JToggleButton[4][4]; // Allocating Size of Grid
            panel1 = new JPanel(new GridLayout(4,4));
            panel1.setBounds(20, 95, 220, 140);
            for(int y = 0; y <4 ; y++){
                    for(int x = 0; x < 4; x++){
                        l[x][y] = new JToggleButton("L" + y + x); // Creates New JButton
                        l[x][y].addActionListener(this);
                        seatsAvailable.add("L" + y + x);
                        panel1.add(l[x][y]); //adds button to grid
                    }
            }

            m = new JToggleButton[4][2]; // Allocating Size of Grid
            panel2 = new JPanel(new GridLayout(2,4));
            panel2.setBounds(240, 165, 220, 70);
            for(int y = 0; y <2 ; y++){
                    for(int x = 0; x < 4; x++){
                        m[x][y] = new JToggleButton("M" + y + x); // Creates New JButton
                        m[x][y].addActionListener(this);
                        seatsAvailable.add("M" + y + x);
                        panel2.add(m[x][y]); //adds button to grid
                    }
            }

            r = new JToggleButton[4][4]; // Allocating Size of Grid
            panel3 = new JPanel(new GridLayout(4,4));
            panel3.setBounds(460, 95, 220, 140);
            for(int y = 0; y <4 ; y++){
                    for(int x = 0; x < 4; x++){
                        r[x][y] = new JToggleButton("R" + y + x); // Creates New JButton
                        r[x][y].addActionListener(this);
                        seatsAvailable.add("R" + y + x);
                        panel3.add(r[x][y]); //adds button to grid
                    }
            }

            panel4 = new JPanel(new FlowLayout());
            panel4.setBounds(0, 250, 300, 70);

            lchild = new JLabel("Child");
            child = new JTextField("0", 2);
            child.addActionListener(this);

            ladult = new JLabel("Adult");
            adult = new JTextField("0", 2);
            adult.addActionListener(this);

            loap = new JLabel("OAP");
            oap = new JTextField("0", 2);
            oap.addActionListener(this);

            submit = new JButton("Submit");
            submit.addActionListener(this);

            oapticket = new Ticket(4.70);
            childticket = new Ticket(3.50);
            adultticket = new Ticket(6.10);     

            child.addKeyListener(new MyKeyAdapter());
            oap.addKeyListener(new MyKeyAdapter());
            adult.addKeyListener(new MyKeyAdapter());

            panel4.add(lchild);
            panel4.add(child);
            panel4.add(ladult);
            panel4.add(adult);
            panel4.add(loap);
            panel4.add(oap);
            panel4.add(submit);

            panel5 = new JPanel(new FlowLayout());
            panel5.setBounds(240, 250, 300, 70);

            ltotalprice = new JLabel("Charge Due (£): ");
            totalprice = new JTextField("£0.00", 5);
            totalprice.setEnabled(false);
            panel5.add(ltotalprice);
            panel5.add(totalprice);

            panel6 = new JPanel(new FlowLayout());
            panel6.setBounds(0, 55, 560, 30);

            time = new JLabel("Please select a film time: ");
            time1 = new JRadioButton("13:00", true);
            time2 = new JRadioButton("15:00", false);
            time3 = new JRadioButton("17:00", false);
            time4 = new JRadioButton("19:00", false);
            time5 = new JRadioButton("21:00", false);

            ButtonGroup group = new ButtonGroup();
            group.add(time1);
            group.add(time2);
            group.add(time3);
            group.add(time4);
            group.add(time5);
            panel6.add(time);
            panel6.add(time1);
            panel6.add(time2);
            panel6.add(time3);
            panel6.add(time4);
            panel6.add(time5);
            time1.addActionListener(this);
            time2.addActionListener(this);
            time3.addActionListener(this);
            time4.addActionListener(this);
            time5.addActionListener(this);
            frame.add(title);
            frame.add(panel1);
            frame.add(panel2);
            frame.add(panel3);
            frame.add(panel4);
            frame.add(panel5);
            frame.add(panel6);
            frame.setPreferredSize(new Dimension(700, 350));
            frame.setTitle("Cinema Booking");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.pack(); //sets appropriate size for frame
            frame.setVisible(true); //makes frame visible


    }

    // Calculates Charge Due for current transaction.
    public double calcChargeDue(){
        DecimalFormat df = new DecimalFormat("#.##");
        double chargeDue = 0.0;
        chargeDue = (a*childticket.price) + (b*oapticket.price) + (c*adultticket.price);
        totalprice.setText("£"+df.format(chargeDue));
        return chargeDue;
    }

    // Method to check if the number of people matches the number of seats selected.
    public void check(){
        int check = coupon.size();
        int noTickets = a + b + c;
        if (check != noTickets){
            submit.setEnabled(false);
        }
        else {
            submit.setEnabled(true);
        }

    }

    // Ticket Object
    public class Ticket {

        double price;

        // Constructor
        public Ticket(double cost) {
            price = cost;
        }

        public double getTicketPrice() {
            return price;
        }

    }

    public void actionPerformed(ActionEvent e)
    {

        a = Integer.parseInt(child.getText());
        b = Integer.parseInt(oap.getText());
        c = Integer.parseInt(adult.getText());

        for(int y = 0; y < 4; y++){
            for(int x = 0; x < 4; x++){

                lselected = l[x][y].isSelected();
                rselected = r[x][y].isSelected();

                if (e.getSource() == l[x][y]) {
                    if(lselected == true){
                        coupon.add(e.getActionCommand());
                        calcChargeDue();
                        check();
                    }
                    else {
                        coupon.remove(e.getActionCommand());
                        check();
                    }
                }

                if (e.getSource() == r[x][y]) {
                    if(rselected == true){
                        coupon.add(e.getActionCommand());
                        calcChargeDue();
                        check();
                    }
                    else {
                        coupon.remove(e.getActionCommand());
                        check();
                    }
                }

                if (e.getSource() == oap){
                    calcChargeDue();
                    check();
                }

                if (e.getSource() == adult){
                    calcChargeDue();
                    check();
                }

                if (e.getSource() == child){
                    calcChargeDue();
                    check();
                }

            }
        }

        for(int y = 0; y < 2; y++){
            for(int x = 0; x < 4; x++){

                mselected = m[x][y].isSelected();

                if (e.getSource() == m[x][y]) {
                    if(mselected == true){
                        coupon.add(e.getActionCommand());
                        calcChargeDue();
                        check();
                    }
                    else {
                        coupon.remove(e.getActionCommand());
                        check();
                    }
                }
            }
        }

        if(time1 == e.getSource()){

        }

        if(time2 == e.getSource()){

        }

        if(time3 == e.getSource()){

        }

        if(time4 == e.getSource()){

        }

        if(time5 == e.getSource()){

        }

        if(submit == e.getSource()) {

            for(int y = 0; y < 4; y++){
                for(int x = 0; x < 4; x++){

                    lselected = l[x][y].isSelected();
                    rselected = r[x][y].isSelected();

                    if (lselected == true) {
                            l[x][y].setEnabled(false);
                    }

                    if (rselected == true) {
                            r[x][y].setEnabled(false);
                    }

                }
            }

            for(int y = 0; y < 2; y++){
                for(int x = 0; x < 4; x++){

                    mselected = m[x][y].isSelected();

                    if (mselected == true) {
                            m[x][y].setEnabled(false);
                    }
                }
            }

            Collections.sort(coupon);
            System.out.println("Here's your ticket:");
            System.out.println(coupon);
            System.out.println("Child: " + child.getText());
            System.out.println("Adult: " + adult.getText());
            System.out.println("OAP: " + oap.getText());
            System.out.println("Total Price: " + totalprice.getText());
            System.out.println("Thank you. Enjoy your film.");
            System.out.println(" ");
            coupon.clear();
            child.setText("0");
            adult.setText("0");
            oap.setText("0");
        }

    }

    // Main Class
    public static void main(String[] args) {
            new cinemaSystem(); //makes new ButtonGrid with 2 parameters
    }
}

Related: Java: Disable all JToggleButtons after Submission — setEnabled(false);

Community
  • 1
  • 1
waltfy
  • 137
  • 3
  • 16
  • You need someway to treat the seats at 13:00 as different to the seats at 15:00. i.e. they are not the same booking. – Peter Lawrey Apr 10 '12 at 18:46
  • @PeterLawrey I think he gets that - he's asking for how he can modify his program to keep track of separate bookings. – Alain Apr 10 '12 at 18:51
  • @HovercraftFullOfEels They're pretty clearly two completely different question - one asking about disabling togglebuttons, one asking about adding a dimension to his data structures. – Alain Apr 10 '12 at 18:52
  • OK, but yet, you still are ignoring the previous question and its replies and have yet to post pertinent code there. – Hovercraft Full Of Eels Apr 10 '12 at 18:53
  • @HovercraftFullOfEels I did not mean to post the previous question as I solved the problem whilst writing the question. It is a mistake I tried to delete it but someone answered really quickly. I have already flagged it; it was a mistake. I'm sorry. – waltfy Apr 10 '12 at 18:56

1 Answers1

2

If you already have it working for one booking time, all you need to do is take all your data structures used for storing information about that booking time and double them up to support several independent booking times.

For instance, ArrayList<String> seatsAvailable = new ArrayList<String>(); will become:

Dictionary<Time, ArrayList<String> > seatsAvailable = 
    new Dictionary<Time,  ArrayList<String> >();

Time firstBooking = new Time(13,0,0);
Time secondBooking = new Time(15,0,0);

seatsAvailable.put( firstBooking , new ArrayList<String>() );
seatsAvailable.put( secondBooking , new ArrayList<String>() );

Now you can keep track of two completely seperate ArrayLists of seatsAvailable.

Alain
  • 26,663
  • 20
  • 114
  • 184
  • I am able to store them to an array of available seats and thank you for answering this question so clearly. However how can I get the JToggleButtons to react to that change in the different arrays? Once again thank you. – waltfy Apr 10 '12 at 18:57
  • This is a little more difficult. Currently you are using the JToggleButtons to store the array of seats and which ones have been selected. You will need to move that storage into a separate array. Create an array (of Booleans) just to store which seats are taken. When the user changes the showtime they want to view, you will have to loop over all ToggleButtons and set their state based on the value stored in your separate array. You will then a Dictionary of your "takenSeats" arrays (just like with the seatsAvailable ArrayList) so that you can keep one for each showtime. – Alain Apr 10 '12 at 19:00