Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Disabling a button inside an anonymous inner class

I have these line of code and I want to disable the button after a passenger has been added. I want to disable the button. seats[i].setEnabled(false) won't work since it's inside an anonymous inner class.

JButton [] seats = new JButton [40]; //creating a pointer to the buttonsArray
for (int i = 0; i < 40; i++)
{
    seats[i] = new JButton();//creating the buttons
    seats[i].setPreferredSize(new Dimension(50,25));//button width
    panel4seating.add(seats[i]);//adding the buttons to the panels
    final int seatingID = i;  // Create a local final variable so it can be passed to the anonymous innerClass...

    seats[i].addActionListener(new ActionListener()
    {  //anonymous inner class
        public void actionPerformed(ActionEvent evt)
        {  
            String firstName = showInputDialog();
            String lastName = showInputDialog();

            sw101.AddPassenger(firstName, lastName, seatingID);//adding a pasenger

            //I want to add a line here that disables the button.
        }
    });
}
like image 445
dave Avatar asked Dec 10 '25 20:12

dave


2 Answers

Because when you do:

setEnabled(false);

inside the anonymous inner class, you're calling that method on the ActionListener instance. not the JButton.

Try this:

JButton [] seats = new JButton[40];

for (int i = 0; i < 40; i++)
{
    final JButton seat = new JButton();
    final int seatingID = i;

    seats[i] = seat;
    seat.setPreferredSize(new Dimension(50,25));
    panel4seating.add(seat);

    seat.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent evt)
        {  
            String firstName = showInputDialog();
            String lastName = showInputDialog();

            sw101.AddPassenger(firstName, lastName, seatingID);

            seat.setEnabled(false);
        }
    });
}
like image 174
Bart Kiers Avatar answered Dec 12 '25 10:12

Bart Kiers


One way is:

((JButton)ae.getSource()).setEnabled(false);:

E.G.

Here is an SSCCE based on your earlier code.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class GuiCreator extends JFrame
{
    public GuiCreator()
    {
        super("Seats");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Container contentPane = getContentPane();
        contentPane.add(new SeatingPanel());

        pack();

        setVisible(true);
    }

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

class SeatListener implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent ae) {
        //String firstName = showInputDialog();
        //String lastName = showInputDialog();

        //sw101.AddPassenger(firstName, lastName, seatingID);//adding a passenger
        ((JButton)ae.getSource()).setEnabled(false);
    }

    public String showInputDialog() {
        return JOptionPane.showInputDialog(null, "Enter Data");
    }
}

class SeatingPanel extends JPanel
{
    public SeatingPanel()
    {
        super(new BorderLayout());

        JPanel panel4seating = new JPanel();//creating a grid panel
        panel4seating.setLayout(new GridLayout(4, 10));//setting the layout of the grid panel

        JButton [] seats = new JButton [40]; //creating a pointer to the buttonsArray
        ActionListener listener = new SeatListener();
        for (int i = 0; i < 40; i++)
        {
            seats[i] = new JButton();//creating the buttons
            //better to set the preferred size of the button
            seats[i].setPreferredSize(new Dimension(50,25));
            panel4seating.add(seats[i]);
            seats[i].addActionListener(listener);
        }

        add(panel4seating, BorderLayout.CENTER);
    }
}

Screenshot

enter image description here

like image 44
Andrew Thompson Avatar answered Dec 12 '25 11:12

Andrew Thompson



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!