Frage

I'm not sure how to pass parameters/arguments into action events. This program is supposed to generate a random times table "flash card", compare it to the correct answer and return output to the console letting the user know if their input was correct. The editor is telling me that i need to make my class abstract, but, obviously that is not a solution.

public class MultiplicationGui {

public static void main(String[] args) 
{
    //new JFrame
    JFrame myJFrame = new JFrame();

    //Attributes
    myJFrame.setTitle("Multiplication Gui");
    myJFrame.setSize(240, 200);
    myJFrame.setLocation(200, 100);
    myJFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    // make the frame visible 
    myJFrame.setVisible(true); 
}

 }//end class

class timesTableFrame extends JFrame implements ActionListener
{
JLabel jlblNote = new JLabel("This GUI gets data from a text field");
JLabel prompt = new JLabel("Please enter your answer");
JTextField jtfAnswer = new JTextField(20);

// constructor 
public timesTableFrame() 
{
    setLayout(new FlowLayout(FlowLayout.CENTER));

    add(jlblNote);
    add(prompt);
    add(jtfAnswer);

    // register TextFieldFrame (this method) as the listener for jtfName
    jtfAnswer.addActionListener(this);

} // end TextFieldFrame() constructor

public void actionPerformed(ActionEvent e, int answer) 
{
    // capture the name from the text field and reset the field
    double response=Double.parseDouble(jtfAnswer.getText());
    jtfAnswer.setText("");

    // output a message using the name to the console
    if (response == answer)
        System.out.println("Congratulations. You are correct!");
    else if (response != answer)
        System.out.println("Sorry, the correct answer is "+answer);

    // dispose of the frame (this frame) 
    this.dispose();


} // end actionPerformed(ActionEvent e)
  //********************************************************************

 class generateArray
 {

public int generateArray()

{
    int i, j;//variables to iterate over array
    int answer;//hold answer from indices into array
    int MDArray[][]=new int [13][13];//new md array for table


    //use nested for to populate array
    for(i=0; i<13; i++)
        for(j=0; j<13; j++)
    MDArray[i][j]=i*j;

    //generate two random numbers from 0-13 to be used as indices into array
    int index1=(int)(Math.random()*13);
    int index2=(int)(Math.random()*13);

    //populate answer variable and return
    answer = MDArray[index1][index2];
    return answer;
}

} }

War es hilfreich?

Lösung

You need to overrid the actionPerformed() with the same signature as defined by ActionListener when implementing ActionListener

You have

public void actionPerformed(ActionEvent e, int answer) 

Which is an incorrect signature. Should just be this

public void actionPerformed(ActionEvent e) 

You should declare the int answer as a class member of timesTableFrame so it can be used inside the actionPerformed. Or access answer through an instantiation of generateArray.

Side note: There are many hints in our comment convo from your post. Take a look at them for option.

Edit: options

Making answer class member

class timesTableFrame ... {
    int answer;  // now answer is a class member of timesTableeFrame

    public void actionPerformed(ActionEvent e){
        // answer can be accessed from inside this method
    }

    class generateArray{
        // answer can be accessed from inside the inner class
    }
}

Using answer without making it a class member

class timesTableFrame ... {
    generateArray generatedArray = new generatedArray();

    public void actionPerformed(ActionEvent e){
        int answer = generatedArray.getAnswer();
    }

    class generateArray{
        private int answer;

        public int getAnswer(){
             return answer;
        }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top