статические Java против нестатических с использованием этого и обработчиков событий - PullRequest
0 голосов
/ 02 декабря 2009

Я пытаюсь узнать об обработчиках событий java и продолжаю получать ошибки с помощью методов типа type (static / non-static), которые я создаю. Какой-то код, который я пытаюсь написать, выглядит так:

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();
  }
}

}

Предполагается настроить GUI для чтения в некоторых целых из файла, а затем вычислить их среднее значение при нажатии кнопки. Тем не менее, я продолжаю получать проблемы со статическими / нестатическими вещами и обработчиками событий. Моя текущая ошибка:
Main.java:35: addActionListener (java.awt.event.ActionListener) в javax.swing.AbstractButton нельзя применить к (javax.swing.JButton)
avgBtn.addActionListener (avgBtn);

Main.java: 91: не удается найти символ
символ: переменная avgBtn
расположение: класс Main
if (e.getSource () == avgBtn) {

Я понимаю, что компилятор не может найти avgBtn, потому что он определен в другой функции (Main ()), но может ли кто-нибудь пролить свет на то, как прикрепить к нему обработчик событий? пробовал «это» тоже безрезультатно ... Заранее спасибо, и если вы видите что-то еще не так, я хотел бы услышать, как я могу сделать это лучше.

1 Ответ

1 голос
/ 02 декабря 2009

Ваш код немного запутан, при компиляции будет больше синтаксических ошибок. Вы не должны смешивать компоненты Swing / AWT, например: вместо использования Label используйте JLabel в Swing, для Panel используйте JPanel.

Обратите внимание на префикс «J» для свинга, возможно, вам следует читать книги, если вы хотите узнать больше о Java (Swing) или даже прочитать некоторые основные учебные пособия.

Не используйте статические методы, если вы не поняли его назначение.

В любом случае, вот ближайший код того, что вы хотите:

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);
    }
}
...