简体   繁体   中英

JButton array ActionListener

In short, I would like to accumulate a bunch of JButton 's to an array, and create one ActionListener class for the array.

I'm trying to create a calculator, and all the numbered buttons, such as "6", are in a JButton array, because I would like to have it input the set number into a temporary int, and it would be easier to create one method, instead of 10. I also have 40 other buttons, that I would like to apply the same principal to, but in a different array, so it would be much faster and easier to put these into a couple of ActionListener methods where the buttons data is implemented to that method. this is the code I have:

private JButton num0, num1, num2, num3, num4, num5, num6, num7, num8, num9;
private JButton numArray[] = {num0, num1, num2, num3, num4, num5, num6, num7, num8, num9};

        public GUI(){
          numArray.AddActionListener(new ActionListener(){
             public void actionPerformed(ActionEvent event){

             }
       });
  }

You can consider the proposal of Newb Monad. However, you can use the same listener for all your buttons, as in the following example.

public static void main(String[] args) {

    ActionListener listener = new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            if (e.getSource() instanceof JButton) {
                String text = ((JButton) e.getSource()).getText();
                JOptionPane.showMessageDialog(null, text);
            }
        }
    };

    JPanel panel = new JPanel(new GridLayout(4,3));

    JButton[] array = new JButton[10];
    for (int i = 0; i < array.length; i++) {
        array[i] = new JButton(String.valueOf(i));
        array[i].addActionListener(listener);
        panel.add(array[i]);
    }

    JOptionPane.showMessageDialog(null, panel);

}

对话

事件

You have the right idea. However, array objects do not have an addActionListener() method. You must add an action listener to each JButton individually. You can use the same listener for every button, but then you have to figure out which button was clicked inside the actionPerformed() method. IMO, a cleaner solution is to assign a separate listener to each JButton because that way each ActionListener can know which number is pressed without checking the source of the event. For example, you can create a NumberButtonListener class which takes an int as the only argument to its constructor. You can then create the JButtons and the corresponding NumberButtonListener s at the same time in a small loop.

I had a similar problem with a 2D array of buttons for a game of "Connect Four". I was able to use a for loop inside ActionListener to test which of my buttons had been pushed. The key was modifying the toString() method from my button class to supply the array element as a string:

Within the JPanel class definition: ...

discs = new RoundButton[6][7]; //my 2D array

...

public class RoundButton extends JButton {
...
    public String toString() {
        return "discs["+i+"]["+j+"]";
    }
...
}

private class ButtonListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent event) {

    for (int i = 0; i < discs.length; i++){
        for (int j= 0; j < discs[i].length; j++){
            if (event.getSource() == discs[i][j]){
                discs[i][j].setIcon(yellowDisc); //my particular action for that button
            }                                       
        }

Sorry this is messy. I've never posted on here before.

This seems to work well for me. I essentially loop through all of the buttons while checking it against the action (e.getSource()).

public void actionPerformed(ActionEvent e){

    //loop through allbuttons to check if clicked
    for(int i = 0; i < buttonArr.length; i++){
        for(int j = 0; j < buttonArr[0].length; j++){
            if(e.getSource() == buttonArr[i][j]){
                //do stuff
            }
        }
    }
        
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM