[英]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: 其他事宜:
catch(NullPointerException e){
. catch(NullPointerException e){
。 If your code throws an NPE, then it's broken code and needs to be fixed.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.