Matt
Matt

Reputation: 33

Dealing with Multiple Action Listeners

I am having trouble getting the sub-total, tax and total to display for my program. I know I need a action listener I am just having problems with implementing multiple listeners for the different Comboboxes as well as the CheckBoxes

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.text.DecimalFormat;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;

public class SB2_Designer extends JFrame {
    private final int WINDOW_WIDTH = 400;   // Window width
    private final int WINDOW_HEIGHT = 500;  // Window height

    //Deck
    private JLabel Dlabel;
    private JComboBox Dbox;
    //Prices for boards
    public final double _Master = 60.00;
    public final double _Dictat = 45.00;
    public final double _Street = 50.00;

    //Trucks
    private JLabel Trlabel;
    private JComboBox Trbox;
    // Prices for Tucks
    public final double _sevenSeven = 35.00;
    public final double _eight = 40.00;
    public final double _eightFive = 45.00;

    //Wheels
    private JLabel Wlabel;
    private JComboBox Wbox;
    // Prices for Wheels
    public final double _fiveOne = 20.00;
    public final double _fiveFive = 22.00;
    public final double _fiveEight = 24.00;
    public final double _sixOne = 24.00;

    //Arrays for ComboBox
    private String[] Decks = {"The Master Thrasher: $60",
            "The Dictator: $45", "The Street King: $50"};
    private String[] Trucks = {"7.75 inch axle: $35",
            "8 inch axle: $40", "8.5 inch axle: $45"};
    private String[] Wheels = {"51 mm: $20",
            "55 mm: $22", "58 mm: $24",
            "61 mm: $28"};

    // accessories check box and label
    private JLabel Atitle;
    private JCheckBox GripBox;
    private JCheckBox BearBox;
    private JCheckBox RiseBox;
    private JCheckBox BoltBox;
    public final double _Grip = 10.00;
    public final double _Bear = 30.00;
    public final double _Rise = 2.00;
    public final double _Bolt = 3.00;


    // Subtotal and textfield
    private JLabel StLabel;
    private JTextField Stfield;
    //Tax and text field 
    private JLabel TaxLabel;
    private JTextField Taxfield;
    // Total and text field
    private JLabel TotLabel;
    private JTextField Totfield;

    // Panels
    private JPanel Dpanel;   // Deck panel
    private JPanel Trpanel;  // Trucks panel
    private JPanel Wpanel;   // Wheel panel
    private JPanel ATitleP;     // Accessories Title
    private JPanel Apanel;   //accessories panel
    private JPanel Stpanel;  // Subtotal panel
    private JPanel Taxpanel; // Tax panel
    private JPanel Totpanel; // Total panel


    public SB2_Designer() {
        // Set the title bar text.
        setTitle("Skateboard Designer");

        // Set the size of the window.
        setSize(WINDOW_WIDTH, WINDOW_HEIGHT);

        // Specify an action for the close button.
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // Add a GridLayout manager to the content pane.
        setLayout(new GridLayout(9, 1));

        // Build the panels.
        buildDpanel();
        buildTrpanel();
        buildWpanel();
        buildATitle();
        buildApanel();
        buildStpanel();
        buildTaxpanel();
        buildTotpanel();


        add(Dpanel);
        add(Trpanel);
        add(Wpanel);
        add(ATitleP);
        add(Apanel);
        add(Stpanel);
        add(Taxpanel);
        add(Totpanel);

        pack();
        setVisible(true);
    }


    // Deck panel
    private void buildDpanel() {

        Dpanel = new JPanel();
        Dlabel = new JLabel("Decks");
        Dpanel.add(Dlabel);
        Dbox = new JComboBox(Decks);
        Dpanel.add(Dbox);
    }

    public double getDeckPrice() {
        double deckPrice = 0.0;

        if (Dbox.getSelectedItem().equals("The Master Thrasher: $60"))
            deckPrice = _Master;

        else if (Dbox.getSelectedItem().equals("The Dictator: $45"))
            deckPrice = _Dictat;

        else if (Dbox.getSelectedItem().equals("The Street King: $50"))
            deckPrice = _Street;

        return deckPrice;
    }


    // Truck panel
    private void buildTrpanel() {

        Trpanel = new JPanel();
        Trlabel = new JLabel("Trucks");
        Trbox = new JComboBox(Trucks);
        Trpanel.add(Trlabel);
        Trpanel.add(Trbox);
    }

    public double getTruckPrice() {
        double TruckPrice = 0.0;

        if (Trbox.getSelectedItem().equals("7.75 inch axle: $35"))
            TruckPrice = _sevenSeven;

        else if (Trbox.getSelectedItem().equals("8 inch axle: $40"))
            TruckPrice = _eight;

        else if (Trbox.getSelectedItem().equals("8.5 inch axle: $45"))
            TruckPrice = _eightFive;

        return TruckPrice;
    }

    // Wheel panel
    private void buildWpanel() {

        Wpanel = new JPanel();
        Wlabel = new JLabel("Wheels");
        Wbox = new JComboBox(Wheels);
        Wpanel.add(Wlabel);

        Wpanel.add(Wbox);
    }

    public double getWheelPrice() {
        double WheelPrice = 0.0;

        if (Wbox.getSelectedItem().equals("51 mm: $20"))
            WheelPrice = _fiveOne;

        else if (Wbox.getSelectedItem().equals("55 mm: $22"))
            WheelPrice = _fiveFive;

        else if (Wbox.getSelectedItem().equals("58 mm: $24"))
            WheelPrice = _fiveEight;

        else if (Wbox.getSelectedItem().equals("61 mm: $28"))
            WheelPrice = _sixOne;

        return WheelPrice;
    }


    private void buildATitle() {
        // Create a label.
        Atitle = new JLabel("Select from the differect accessories below");
        ATitleP = new JPanel();
        ATitleP.add(Atitle);

    }

    private void buildApanel() {

        // Create the check boxes.
        GripBox = new JCheckBox("Grip Tape: $10");
        BearBox = new JCheckBox("Bearings: $30");
        RiseBox = new JCheckBox("Riser Pads: $2");
        BoltBox = new JCheckBox("Nuts & Bolts Kit: $3");

        // adds check box panel
        Apanel = new JPanel();
        Apanel.add(GripBox);
        Apanel.add(BearBox);
        Apanel.add(RiseBox);
        Apanel.add(BoltBox);
    }

    public double getAccprice() {
        double Accprice = 0;

        if (GripBox.isSelected())
            Accprice += _Grip;
        if (BearBox.isSelected())
            Accprice += _Bear;
        if (RiseBox.isSelected())
            Accprice += _Rise;
        if (BoltBox.isSelected())
            Accprice += _Bolt;

        return Accprice;
    }

    private void buildStpanel() {
        StLabel = new JLabel("Sub-Total:");
        Stfield = new JTextField(10);
        Stfield.setEditable(false);
        Stfield.setText("0.00");

        Stpanel = new JPanel();
        Stpanel.add(StLabel);
        Stpanel.add(Stfield);
    }

    private void buildTaxpanel() {
        TaxLabel = new JLabel("Tax:");
        Taxfield = new JTextField(10);
        Taxfield.setEditable(false);
        Taxfield.setText("0.00");

        Taxpanel = new JPanel();
        Taxpanel.add(TaxLabel);
        Taxpanel.add(Taxfield);
    }

    private void buildTotpanel() {
        TotLabel = new JLabel("Total:");
        Totfield = new JTextField(10);
        Totfield.setEditable(false);
        Totfield.setText("0.00");

        Totpanel = new JPanel();
        Totpanel.add(TotLabel);
        Totpanel.add(Totfield);
    }


    public void calc() {
        double subtotal;
        double salestax = 0.06;
        double total;
        double tax;


        DecimalFormat dollar = new DecimalFormat("#,##0.00");

        subtotal = getDeckPrice() + getTruckPrice() + getWheelPrice();

        //get tax rate
        tax = subtotal * salestax;

        //calc tax amount
        total = subtotal + tax;

        //parse and format tax amount
        //set tax text field with tax amount
        Stfield.setText(dollar.format(subtotal));
        Taxfield.setText(dollar.format(tax));
        Totfield.setText(dollar.format(total));

    }


    public static void main(String[] args) {
        new SB2_Designer();
    }
}

Upvotes: 1

Views: 885

Answers (3)

Freek de Bruijn
Freek de Bruijn

Reputation: 3622

The three combo boxes could use an ActionListener that calls the calc method and the four check boxes could use an ItemListener in a similar way. You can add the following code to the SB2_Designer constructor (using Java 8 syntax for the two listeners):

add(Dpanel);
add(Trpanel);
add(Wpanel);
add(ATitleP);
add(Apanel);
add(Stpanel);
add(Taxpanel);
add(Totpanel);

// New code starts here.
calc();

ActionListener actionListener = actionEvent -> calc();
Dbox.addActionListener(actionListener);
Trbox.addActionListener(actionListener);
Wbox.addActionListener(actionListener);

ItemListener itemListener = itemEvent -> calc();
GripBox.addItemListener(itemListener);
BearBox.addItemListener(itemListener);
RiseBox.addItemListener(itemListener);
BoltBox.addItemListener(itemListener);
// New code ends here.

pack();
setVisible(true);

For Java 7 or before, you can create the two listeners like this:

ActionListener actionListener = new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent actionEvent) {
        calc();
    }
};

In the calc method, the price of the accessories is not taken into account yet. If you replace the line below, it should work:

//subtotal = getDeckPrice()+ getTruckPrice() + getWheelPrice();
subtotal = getDeckPrice()+ getTruckPrice() + getWheelPrice() + getAccprice();

Upvotes: 1

vlatkozelka
vlatkozelka

Reputation: 999

Well you already have the method called calc(), all you need to do is add an ActionListener to each component you want that added to and call that method:

oneOfYourComboBoxes.addActionListener(new ActionListener(){

    @Override
    public void onActionPerformed(ActionEvent evt){

        //just call calc
        calc();

    }

});

Upvotes: 2

Hovercraft Full Of Eels
Hovercraft Full Of Eels

Reputation: 285401

Myself, I'd remove listeners from all those components, and instead add one JButton to your GUI, a "total" JButton, a button whose responsibility is to let the user tell the app that he's done entering all info into the GUI, and now wants his bill calculated. A listener would be added to that and only that JButton, and when pressed, it will query the state of your JComboBoxes, your JRadioButtons and your JCheckBoxes, and sum everything up.

Upvotes: 2

Related Questions