无法在Action侦听器(Jframe)中引用非变量

以下程序的目标是要求用户输入一个电阻值,然后程序将为每个数字输出相应的颜色。 因此,这不包括所有数字。 但是,该程序已经完成,我已经尝试将JFrame作为一个额外的东西,除了我挂了如何在动作监听器中打印相应的颜色。

这行调用了特定的方法,对于3位数字然后继续打印颜色,除了如何将我和我的其余代码合并到我的JFrame和/或ActionListener中。 System.out.println(array3 [i])行; /

在尝试简单地在动作监听器中打印颜色值时,我确实收到错误“无法引用非最终变量”….

我曾尝试在线查看各种教程,甚至是Java API和指南,但这些教程都无济于事。 总的来说,我似乎并不知道如何将已编写的代码合并到JFrame中,无论这是一个繁琐的过程,我愿意团结一致,并且非常感谢能够解决如何应对这种困境的一些见解。

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] = 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; } } 

在Java中,您不能在匿名内部类中引用最终变量。 您尝试在ActionListener匿名实现中访问array3 。 您可以简单地将array3更改为final,即:

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

另外,要打印数组内容,可以使用Arrays.toString()

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