java - JFrame 总是为 Action 监听器内的变量输出 null

标签 java arrays swing jframe actionlistener

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

我之前问过这个问题,但由于忘记输入特定标签,得到的答复有限。然而,用户回答使用 ArraysToString 实际上什么也没做,因为程序仍然设法打印 null。

Cannot refer to non variable inside Action listener (Jframe) JFrame 下面的方法用于根据数字收集电阻器每个色带的信息,就像在 Action 监听器中一样,我尝试简单地打印出这些颜色,但它总是打印 null(3 次)

我尝试过在线查看各种教程,甚至 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.*;
import java.util.Arrays;

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"));

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

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



      } 

    });

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

最佳答案

数组 array3 将始终为 null,因为它是这样声明的:

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

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

从上面的代码中可以看出,它从未被分配过任何类型的 String 对象,因此默认为 null。您必须先填充它才能保存非空值。想象一个类似于鸡蛋箱的对象数组:除非你用鸡蛋填充它,否则它永远是空的。

我建议您将想要传递到内部类的任何变量设置为final。但它必须在outer类中是final的,而不是在inner类中:

更重要的是,我会将大部分代码从主方法中取出,从静态区域移至其所属的实例区域。然后你就可以使用类字段而不必担心局部最终变量。我认为这就是您当前程序的主要弱点——太多的静态代码和没有足够的符合 OOP 的类和对象。

您的另一个问题是,您似乎试图将 Swing GUI 与控制台程序混合使用,该程序通过 GUI 和通过 BufferedReader 的标准获取用户输入,这可能会导致灾难。我强烈建议您选择其中之一,在我看来,使用 Swing GUI 可能更好,而不是尝试混合这些不可混合的东西。

关于java - JFrame 总是为 Action 监听器内的变量输出 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15824797/

相关文章:

java - 收到错误消息 "Code Recommenders cannot download its model repository index"

java - 与 ArrayAdapter 作斗争

c - 错误 : lvalue required as left operand of assignment in a swap with pointers

java - 查找未排序数组中的唯一元素

c - 访问不存在的数组元素

java - 我的列名称没有显示在我的 JTable 中

Java ArrayList.remove() 不减少 ArrayList 的大小

java - 解析纬度/经度数组列表以获得最西纬度

java - jcombobox 用 hashmap 填充

java - JDialog的方法返回null