问题
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