views:

345

answers:

1

Hello, I'm trying to learn about java's event handlers and keep getting errors with type type (static/non-static) methods I create. Some code I'm trying to write looks like:

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

public class Main extends JFrame implements ActionListener{

  static private int[] intArray = new int[10000];
  static private int numOfInts = 0;
  static private int avg = 0;

  public static void main(String[] args) {

    //create main frame
    JFrame frame = new JFrame();
    frame.setTitle("Section V, question 2");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(350, 250);
    frame.setLayout(new GridLayout(4, 1));
    frame.setVisible(true);

  //create instruction label and add to frame
  Label instructions = new Label("Follow the instructions on the exam to use this program");
  frame.add(instructions);

  //create textfield for index entry and add to frame
  JTextField indexEntry = new JTextField();
  frame.add(indexEntry);

  //create button for average and add to frame
  JButton avgBtn = new JButton("Click for Average");
  frame.add(avgBtn);
  avgBtn.addActionListener(avgBtn);

  //create panel to display results and add to frame
  JPanel resultsPanel = new JPanel();
  resultsPanel.setBackground(Color.BLUE);
  frame.add(resultsPanel);

  //read in from file
  readFromFile();

  //compute average
  computeAverage();

  System.out.println(avg);

}

static private void readFromFile(){
  try{
    // Open the file that is the first
    // command line parameter
    FileInputStream fstream = new FileInputStream("numbers.dat");
    // Get the object of DataInputStream
    DataInputStream in = new DataInputStream(fstream);
    BufferedReader br = new BufferedReader(new InputStreamReader(in));
    String strLine;
    //Read File Line By Line
    int i = 0;
    while ((strLine = br.readLine()) != null)   {
      // Print the content on the console
      System.out.println (strLine);
      intArray[i] = Integer.parseInt(strLine);
      numOfInts++;
      i++;
    }
    //Close the input stream
    in.close();
    System.out.println ("numOfInts = " + numOfInts);
  }
  catch (Exception e){//Catch exception if any
    System.err.println("Error: " + e.getMessage());
  }
}

static private void computeAverage(){
  int sum = 0;

  for(int i = 0; i < numOfInts; i++)
    sum += intArray[i];

  avg = sum/numOfInts;

  //return avg;
}

public void actionPerformed(ActionEvent e){
   if(e.getSource() == avgBtn){
     computeAverage();
  }
}

}

Which is supposed to setup a GUI read in some ints from a file and then compute their average when a button is pressed. However, I keep getting problems with the static/non-static stuff and the event handers. My current error are:
Main.java:35: addActionListener(java.awt.event.ActionListener) in javax.swing.AbstractButton cannot be applied to (javax.swing.JButton)
avgBtn.addActionListener(avgBtn);

Main.java:91: cannot find symbol
symbol : variable avgBtn
location: class Main
if(e.getSource() == avgBtn){

I understand that the compiler can't find avgBtn because its defined within another function (Main()), but can anyone shed some light on how to attach an event handler to it? tried 'this' to no avail also...Thanks in advance, and if you see anything else wrong I'd love to hear how I can make it better.

+2  A: 

Your code is a bit messy, there will be more syntax errors if compiled. You should not mix swing/awt components, for instance: instead of using Label use JLabel in swing, for Panel use JPanel.

Take note of the "J" prefix for swing, you should be reading books perhaps if you want to know more on Java(Swing) or even read some basic tutorials.

Do not use static methods unless you have understand its purpose.

Anyhow here is the closest code of what you want:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
public class Main extends JFrame implements ActionListener {
    private int[] intArray = new int[10000];
    private int numOfInts = 0;
    private int avg = 0;

    protected JButton avgBtn;
    protected JTextField indexEntry;
    protected JLabel instructions;
    protected JPanel resultsPanel;

    //constructor - construct the components here and do the initializations
    public Main(){
        //create main frame  
     this.setTitle("Section V, question 2");
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     this.setSize(350, 250);
     this.setLayout(new GridLayout(4, 1));
     //this.setVisible(true);

     //create instruction label and add to frame
     instructions = new JLabel("Follow the instructions on the exam to use this program");
     this.add(instructions);

     //create textfield for index entry and add to frame
     indexEntry = new JTextField();
     this.add(indexEntry);

     //create button for average and add to frame
     avgBtn = new JButton("Click for Average");
     this.add(avgBtn);
     avgBtn.addActionListener(this);

     //create panel to display results and add to frame
     resultsPanel = new JPanel();
     resultsPanel.setBackground(Color.BLUE);
     this.add(resultsPanel);

     //read in from file
     readFromFile();

     //compute average
     computeAverage();
     System.out.println(avg);
    }

    private void readFromFile() {
     try {
      // Open the file that is the first
      // command line parameter
      FileInputStream fstream = new FileInputStream("numbers.dat");
      // Get the object of DataInputStream
      DataInputStream in = new DataInputStream(fstream);
      BufferedReader br = new BufferedReader(new InputStreamReader(in));
      String strLine;
      //Read File Line By Line
      int i = 0;
      while ((strLine = br.readLine()) != null) {
       // Print the content on the console
       System.out.println (strLine);
       intArray[i] = Integer.parseInt(strLine);
       numOfInts++;
       i++;
      }
      //Close the input stream
      in.close();
      System.out.println ("numOfInts = " + numOfInts);
     }
     catch (Exception e) {
      //Catch exception if any
      System.err.println("Error: " + e.getMessage());
     }
    }
    private void computeAverage() {
     int sum = 0;
     for (int i = 0; i < numOfInts; i++)
     sum += intArray[i];
     avg = sum/numOfInts;
     //return avg;
    }

    public void actionPerformed(ActionEvent e) {
     if(e.getSource() == avgBtn) {
      computeAverage();
     }
    }

    public static void main(String[] args) {
        Main m = new Main();
        m.setVisible(true);
    }
}
jerjer
That works perfect. I guess a solution is to create a static main() which calls what you really want to execute? Thanks so much...
danwoods