简体   繁体   English

如何将ActionListeners添加到ArrayList中的按钮?

[英]How to add ActionListeners to buttons within an ArrayList?

I'm working on a project in which a parsing program read data from an input file, tokenizes it, then builds a GUI out of it. 我正在一个项目中,其中解析程序从输入文件中读取数据,将其标记化,然后从中构建一个GUI。 In this case it's a calculator GUI. 在这种情况下,它是计算器GUI。 I'm trying to write the code for the calculator operations now and I'm having trouble adding ActionListeners to the buttons of the calculator. 我现在尝试编写计算器操作的代码,但在将ActionListeners添加到计算器的按钮时遇到问题。 They are stored in an ArrayList and when I try using the addActionListener() function I receive the following error: 它们存储在ArrayList中,当我尝试使用addActionListener()函数时,收到以下错误:

ActionListener error ActionListener错误

Below is my code for the builder file: 以下是我的构建器文件代码:

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

public class GUIBuilder implements ActionListener {
    //Declare variables
    boolean[] function = new boolean[4];
    double[] temp = {0, 0};
    static JFrame outputFrame;  //Declare GUI window frame
    static JPanel panel1, panel2, panel3, panel4;  //Declare GUI panel variables
    static Container container;  //Declare GUI container variable
    static JTextField textField;  //Declare GUI text field variable
    static ArrayList<JButton> button;
    static ArrayList<JLabel> label;
    static ArrayList<JRadioButton> radio;
    static GUIParser guiParser;  //Create instance of GUIParser 

    public static void main(String[] args) throws Exception {

    //Instantiates a GUIParser object
    guiParser = new GUIParser();

    //Instantiates ArrayList objects
    button = new ArrayList<>();
    label = new ArrayList<>();      
    radio = new ArrayList<>();

    //Instantiates a GUIBuilder object that invokes frameConstructor() method
    GUIBuilder guiBuilder = new GUIBuilder();
    guiBuilder.frameConstructor();  
    }

    public void frameConstructor() {

    //Instantiates a JFrame object
    outputFrame = new JFrame();

    //Sets window size
    outputFrame.setSize(this.guiParser.getWindowWidth(),this.guiParser.getWindowHeight());  //Sets size of outputFrame to the return value of getWindowWidth method

    //Sets window name
    outputFrame.setTitle(this.guiParser.getWindowName());  //Sets title of window to return value of getWindowName method
    outputFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  //Sets the default close operation to exit

    container = outputFrame.getContentPane();
    if (this.guiParser.getWindowLayout() == 0) { //If return value of getWindowLayout is 0, use flow layout
            container.setLayout(new FlowLayout());
    } else { //If return value is other than 0, use grid layout
            if (this.guiParser.getHorizontalSpace() != 0 && this.guiParser.getVerticalSpace() != 0) {  //If return values of getHorizontalSpace and getVerticalSpace are zero, create Grid layout with these dimensions
        container.setLayout(new GridLayout
        (this.guiParser.getNumRows(),this.guiParser.getNumColumns(),
        this.guiParser.getHorizontalSpace(),this.guiParser.getVerticalSpace()));
            } else {  //Otherwise create a Grid layout with these dimensions
                container.setLayout(new GridLayout
        (this.guiParser.getNumRows(),this.guiParser.getNumColumns()));
            }
    }

    //Instantiates new JPanel objects
    panel1 = new JPanel();
    panel2 = new JPanel();
    panel3 = new JPanel();
    panel4 = new JPanel();
    if (this.guiParser.getPanelLayout() == 0) { //If return value of getPanelLayout is zero, use flow layout
            panel1.setLayout(new FlowLayout());
            panel2.setLayout(new FlowLayout());
            panel3.setLayout(new FlowLayout());
        } else { //Otherwise use grid layout, set dimensions according to input values
            if (this.guiParser.getHorizontalSpace() != 0 && this.guiParser.getVerticalSpace() != 0) {
        panel1.setLayout(new GridLayout
                    (this.guiParser.getNumRows(),this.guiParser.getNumColumns(),
                        this.guiParser.getHorizontalSpace(),this.guiParser.getVerticalSpace()));
        panel2.setLayout(new GridLayout
                    (this.guiParser.getNumRows(),this.guiParser.getNumColumns(),
            this.guiParser.getHorizontalSpace(),this.guiParser.getVerticalSpace()));
        panel3.setLayout(new GridLayout
                    (this.guiParser.getNumRows(),this.guiParser.getNumColumns(),
            this.guiParser.getHorizontalSpace(),this.guiParser.getVerticalSpace()));
        panel4.setLayout(new GridLayout
                    (this.guiParser.getNumRows(),this.guiParser.getNumColumns(),
            this.guiParser.getHorizontalSpace(),this.guiParser.getVerticalSpace()));
            } else {
        panel1.setLayout(new GridLayout
                    (this.guiParser.getNumRows(),this.guiParser.getNumColumns()));
        panel2.setLayout(new GridLayout
                    (this.guiParser.getNumRows(),this.guiParser.getNumColumns()));
        panel3.setLayout(new GridLayout
                    (this.guiParser.getNumRows(),this.guiParser.getNumColumns()));
        panel4.setLayout(new GridLayout
                    (this.guiParser.getNumRows(),this.guiParser.getNumColumns()));
            }
    }

    //Instantiates a JTextField object and sets text field width with the return value of getTextWidth()   
    textField = new JTextField("", this.guiParser.getTextWidth());
    container.add(textField);  //Add the text field to the Jframe container
    panel1.add(textField);  //Add the text field to panel 1

    //Walk through the buttonList array and add buttons to the container and panel 2
    int i = 0;
    Iterator<String> iterator = this.guiParser.getButtonList().iterator();
    while (iterator.hasNext()) {
            button.add(new JButton(iterator.next()));
            container.add(button.get(i));
            panel2.add(button.get(i));
            button.addActionListener(this);
            i++;
    }

    //Walk through the radioList array and add radio buttons to the container and panel 3
    i = 0;
    iterator = this.guiParser.getRadioList().iterator();
    while (iterator.hasNext()) {
            radio.add(new JRadioButton(iterator.next()));
            container.add(radio.get(i));
            panel3.add(radio.get(i));
            i++;
    }

    //Walk through the labelList array and add labels to the container and panel 4
    i = 0;
    iterator = this.guiParser.getLabelList().iterator();
    while (iterator.hasNext()) {
            label.add(new JLabel(iterator.next()));
            container.add(label.get(i));
            panel4.add(label.get(i));
            i++;
    }

        //Add each panel to the output frame and set its visibility
    outputFrame.add(panel1);
    outputFrame.add(panel2);
    outputFrame.add(panel3);
    outputFrame.setVisible(true);
        for(i = 0; i < 16; i++){

        }
    }

    public void clear(){
        try{
            textField.setText("");
            for(int i = 0; i < 4; i++){
                function[i] = false;
            }
            for(int i = 0; i < 2; i++){
                temp[i] = 0;
            }
        } catch(NullPointerException e){

        }
    }


    public void calcResult(){
        double result = 0;
        temp[1] = Double.parseDouble(textField.getText());
        String temp0 = Double.toString(temp[0]);
        String temp1 = Double.toString(temp[1]);
        try{
            if(temp0.contains("-")){
                String[] temp00 = temp0.split("-", 2);
                temp[0] = (Double.parseDouble(temp00[1]) * -1);
            }
            if(temp1.contains("-")){
                String[] temp11 = temp1.split("-", 2);
                temp[1] = (Double.parseDouble(temp11[1]) * -1);
            }
        } catch(ArrayIndexOutOfBoundsException e){

        }
        try{
            if(function[2] == true){
                result = temp[0] * temp[1];
            } else if(function[3] == true){
                result = temp[0] / temp[1];
            } else if(function[0] == true){
                result = temp[0] + temp[1];
            } else if(function[1] == true){
                result = temp[0] - temp[1];
            }
            textField.setText(Double.toString(result));
            for(int i = 0; i < 4; i++){
                function[i] = false;
            }
        } catch(NumberFormatException e){

        }
    }

    @Override
    public void actionPerformed( ActionEvent ae) {
        if(ae.getSource() == button.get(0)){
            textField.setText("1");
        }
        if(ae.getSource() == button.get(1)){
            textField.setText(textField.getText().concat("2"));
        }
        if(ae.getSource() == button.get(2)){
            textField.setText(textField.getText().concat("3"));
        }
        if(ae.getSource() == button.get(3)){
            textField.setText(textField.getText().concat("4"));
        }
        if(ae.getSource() == button.get(4)){
            textField.setText(textField.getText().concat(""));
        }
        if(ae.getSource() == button.get(5)){
            textField.setText(textField.getText().concat("1"));
        }
        if(ae.getSource() == button.get(6)){
            textField.setText(textField.getText().concat("1"));
        }
        if(ae.getSource() == button.get(7)){
            textField.setText(textField.getText().concat("1"));
        }
        if(ae.getSource() == button.get(8)){
            textField.setText(textField.getText().concat("1"));
        }
        if(ae.getSource() == button.get(9)){
            textField.setText(textField.getText().concat("1"));
        }
        if(ae.getSource() == button.get(10)){
            textField.setText(textField.getText().concat("1"));
        }
        if(ae.getSource() == button.get(11)){
            textField.setText(textField.getText().concat("1"));
        }
        if(ae.getSource() == button.get(12)){
            textField.setText(textField.getText().concat("1"));
        }
        if(ae.getSource() == button.get(13)){
            textField.setText(textField.getText().concat("1"));
        }
        if(ae.getSource() == button.get(14)){
            textField.setText(textField.getText().concat("1"));
        }
        if(ae.getSource() == button.get(15)){
            textField.setText(textField.getText().concat("1"));
        }
    }    
}

Your button.addActionListener(this); 您的button.addActionListener(this); should be button.get(i).addActionListener(this); 应该是button.get(i).addActionListener(this); .

That being said, you should keep a reference to the button that you create in each iteration instead of retrieving it from the ArrayList every time you subsequently modify it in that loop: 话虽如此,您应该保留对您在每次迭代中创建的按钮的引用,而不是每次随后在该循环中对其进行修改时都从ArrayList中检索它:

while (iterator.hasNext()) {
        JButton newButton = new JButton(iterator.next());
        button.add(newButton);
        container.add(newButton);
        panel2.add(newButton);
        newButton.addActionListener(this);
}

Your button variable is an ArrayList, and so this: 您的按钮变量是ArrayList,因此:

button.addActionListener(this);

makes no sense, since it doesn't make sense to add an ActionListener to an ArrayList. 没有意义,因为将ActionListener添加到ArrayList没有意义。 You want to add the ActionListener to the JButton element held by the ArrayList. 您想要将ActionListener添加到ArrayList 持有的JButton元素中。 So... 所以...

button.get(i).addActionListener(this);

Other issues: 其他事宜:

  • Your code is over-using the static modifier, and this will make it very inflexible and can even increase the risk for future bugs. 您的代码过度使用了static修饰符,这将使其变得非常不灵活,甚至可能增加将来出现错误的风险。 Java is an object-oriented language, and is best used if you create your apps in an OOP way. Java是一种面向对象的语言,如果以OOP方式创建应用程序,则最好使用Java。
  • You never want to do: catch(NullPointerException e){ . 您永远不需要做: catch(NullPointerException e){ If your code throws an NPE, then it's broken code and needs to be fixed. 如果您的代码抛出NPE,则它是损坏的代码,需要进行修复。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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