Работа с несколькими прослушивателями действий

У меня возникли проблемы с отображением промежуточной суммы, налога и общей суммы для моей программы. Я знаю, что мне нужен прослушиватель действий. У меня просто проблемы с реализацией нескольких прослушивателей для разных полей со списком, а также для флажков.

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

person Matt    schedule 17.12.2015    source источник


Ответы (3)


Лично я бы удалил слушателей из всех этих компонентов и вместо этого добавил бы одну кнопку JButton в ваш графический интерфейс, «всего» JButton, кнопку, которая отвечает за то, чтобы позволить пользователю сообщить приложению, что он закончил вводить всю информацию в графический интерфейс, и теперь хочет, чтобы его счет был рассчитан. Слушатель будет добавлен к этому и только к этому JButton, и при нажатии он будет запрашивать состояние ваших JComboBox, ваших JRadioButtons и ваших JCheckBox и суммировать все.

person Community    schedule 17.12.2015
comment
Большое спасибо, это было большой помощью. Не знаю, почему я сам об этом не подумал. Прошлой ночью я не спал до 5 утра, пытаясь понять, что делать. Еще раз спасибо - person Matt; 18.12.2015

Что ж, у вас уже есть метод с именем calc(), все, что вам нужно сделать, это добавить ActionListener к каждому компоненту, который вы хотите добавить, и вызвать этот метод:

oneOfYourComboBoxes.addActionListener(new ActionListener(){

    @Override
    public void onActionPerformed(ActionEvent evt){

        //just call calc
        calc();

    }

});
person vlatkozelka    schedule 17.12.2015

Три поля со списком могут использовать 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();
person Freek de Bruijn    schedule 17.12.2015