Cannot refer to non variable inside Action listener (Jframe)

我是研究僧i 提交于 2019-12-02 16:06:15

问题


The following program's goal is to ask the user to input a resistor value, then of which the program will output the corresponding colors for each digit. This thus not include all the digits. However, that program is done, I've made an attempt to incorporate JFrame as an extra thing, except I am hung up on how to print the corresponding colors in the action listener.

This line calls the specific methods, for the 3 digits then proceeds to print the colors, except how do I incorporate that and the rest of my code into my JFrame, and or ActionListener. The line System.out.println(array3[i]);/

I do receive the errors when trying to simply print the color values in the action listener "Cannot refer to a non-final variable"....

I have tried viewing various tutorials online, and even the Java API and guidelines, none of which could help. In general I seem unaware of how to incorporate code that is already written into JFrame, whether it's a tedious process, I am willing to corporate and would be very grateful for some insight on how to tackle this predicament.

import java.io.*;
import javax.swing.*;
//import javax.swing.JFrame;
//import javax.swing.JLabel;
//import javax.swing.JButton;
//import javax.swing.JPanel;
//import javax.swing.JTextField;
import java.awt.event.*;


public class test extends JFrame
{
  public static void main (String [] args) throws IOException
  {
    BufferedReader myInput = new BufferedReader (new InputStreamReader (System.in));


    //calling variables
    String input;
    int numInput;

    JLabel l = new JLabel("Hello and welcome to the Program (Press the button to start the instructions");
    //l.setAlignmentX(0);
    // l.setAlignmentY(0);

    //calling arrays
    int [] array = new int [5];
    int [] array2 = new int [3];
    String [] array3 = new String [3];
    String[] colours = {"black", "brown", "red", "orange", "yellow", "green", "blue", "violet", "gray", "white"};


    JFrame f = new JFrame("Hello JFrame");
    f.setSize(500,500);
    //f.getContentPane().setBackground(Color.CYAN);
    f.add(l);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setVisible(true);

    //JTextField t = new JTextField(16);


    JPanel p = new JPanel ();
    JButton b = new JButton("Press me") ;
    // b.setAlignmentX(0);
    // b.setAlignmentY(0);

    b.addActionListener(new ActionListener(){
      public void actionPerformed (ActionEvent e) {
        JOptionPane.showMessageDialog(null,"In the following program you (The user!) will input a number of a resistor value \nThe program will pass the information into methods and then proceed to print out \nThe coorelating colors (Press the button to be asked for input)");
        int number = Integer.parseInt(JOptionPane.showInputDialog("Please enter the resistor value"));


        JOptionPane.showMessageDialog(null, "The Colors are : " + (array3[i] + "\n" ));



      } 

    });

    p.add(b);
    p.add(l);
    //p.add(t);
    f.add(p);


    System.out.println("Hello and welcome to the Program (Press any key to con't)");
    input = myInput.readLine ();

    System.out.println("In the following program you (The user!) will input a number of a resistor value");
    System.out.println("The program will pass the information into methods and then proceed to print out");
    System.out.println("The coorelating colors (Press any key to be asked for input)");
    input = myInput.readLine();

    System.out.println("Enter a resistor value (Note that resistors can only acount to 4 decimal places");
    input = myInput.readLine ();
    numInput = Integer.parseInt (input);

    //colours for values
    array2 = values(array, input, colours);
    for(int i = 0 ; i < 3; i++){
      array3[i] = digitColours(array2[i], colours);
      System.out.println(array3[i]);// prints colours for values
    }


    //prints 4th colour for multiplier
    System.out.println(decimalPlaces(input, colours));

  } 

  public static int[] values (int [] digit, String num, String[] colours)
  {

    String holder;
    double numHolder;
    int lengthOfInput;
    int holder2;

    //tollerance
    holder = num.substring(3,4);
    digit[3] = Integer.parseInt(holder);
    holder2 = Integer.parseInt(num);
    // checks to see if above 5
    if(digit[3] < 5){
      digit[3] = digit[3]/holder2 * 100;
    }
    else if(digit[3] > 5){
      digit[3] = 10 - digit[3];
      digit[3] = digit[3]/holder2 * 100;
    }
    System.out.println(digit[3]);

    //Rounding of the input
    lengthOfInput = num.length() - 3;
    numHolder = Double.parseDouble(num);
    numHolder = numHolder/(Math.pow(10,lengthOfInput));
    numHolder = (int)(Math.round(numHolder)+0.5);

    // first three digits
    for(int i = 0; i < 3; i++){
      holder = num.substring(i,i+1);
      digit[i] = Integer.parseInt(holder);
    }

    //print out for information
    /*System.out.println("The first digit is rounded to:" + (int)digit[0]);
     System.out.println("The second digit is roudned to:" + (int)digit[1]);                   
     System.out.println("The third digit is roudned to:" + (int)digit[2]);  */
    /* */
    return new int[] {digit[0], digit[1],digit[2],digit[3]} ;// return
  }


  public static String digitColours(int decimalPlace, String[] colours){
    //calling additional variables
    String answer;
    answer = colours[decimalPlace];
    return answer;
  }


  //method to find the multiplier
  public static String decimalPlaces(String input, String[] colours){
    //calling additional variables
    int length = input.length();
    String answer;

    length = length - 3;
    answer = colours[length];

    return answer;
  }
} 

回答1:


In Java you cannot refer to not final variables inside anonymous inner class. You attempt to access array3 inside anonymous implementation of ActionListener. You can simply change array3 to final, ie:

final String [] array3 = new String [3];

Also, to print a content of array you can use Arrays.toString():

JOptionPane.showMessageDialog(null, "The Colors are : " + (Arrays.toString(array3)));


来源:https://stackoverflow.com/questions/15824158/cannot-refer-to-non-variable-inside-action-listener-jframe

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!