简体   繁体   English

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

[英]Cannot refer to non variable inside Action listener (Jframe)

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. 但是,该程序已完成,我尝试将JFrame作为额外的东西合并,除了我迷上了如何在动作侦听器中打印相应的颜色。

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. 该行调用特定的方法,然后3位数字继续打印颜色,除了如何将其和其余代码合并到JFrame和/或ActionListener中。 The line System.out.println(array3[i]);/ 行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. 我尝试过在线查看各种教程,甚至Java API和指南,这些都无济于事。 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. 总的来说,我似乎不知道如何将已经写入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] = 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;
  }
} 

In Java you cannot refer to not final variables inside anonymous inner class. 在Java中,您不能引用匿名内部类中的非最终变量。 You attempt to access array3 inside anonymous implementation of ActionListener . 您尝试在ActionListener匿名实现中访问array3 You can simply change array3 to final, ie: 您可以简单地将array3更改为final,即:

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

Also, to print a content of array you can use Arrays.toString() : 另外,要打印数组的内容,可以使用Arrays.toString()

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM