处理多个动作监听器

时间:2015-12-17 22:26:49

标签: java swing actionlistener jcombobox jcheckbox

我无法获得为我的计划显示的小计,税金和总额。我知道我需要一个动作监听器我只是遇到了为不同的Comboboxes和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();
    }
}

3 个答案:

答案 0 :(得分:2)

我自己,我将从所有这些组件中删除侦听器,而是在GUI中添加一个JButton,一个"总计" JButton,一个按钮,其职责是让用户告诉应用他已完成将所有信息输入GUI,现在想要计算他的账单。只有那个JButton会添加一个监听器,当按下它时,它将查询你的JComboBoxes,你的JRadioButtons和你的JCheckBoxes的状态,并总结一切。

答案 1 :(得分:2)

您已经拥有名为calc()的方法,您需要做的就是将ActionListener添加到您想要添加的每个组件并调用该方法:

oneOfYourComboBoxes.addActionListener(new ActionListener(){

    @Override
    public void onActionPerformed(ActionEvent evt){

        //just call calc
        calc();

    }

});

答案 2 :(得分:1)

三个组合框可以使用调用ActionListener方法的calc,并且四个复选框可以以类似的方式使用ItemListener。您可以将以下代码添加到SB2_Designer构造函数中(使用两个侦听器的Java 8语法):

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);

对于Java 7或之前,您可以像这样创建两个侦听器:

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

calc方法中,尚未考虑配件的价格。如果你替换下面的行,它应该工作:

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