1

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

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

不能引用动作侦听器(Jframe)中的非变量 JFrame 下面的方法可以根据数字编号收集电阻器的每个色带的信息,而在动作侦听器中,我尝试简单地打印出这些颜色,但它总是打印 null (3次)

我尝试过在线查看各种教程,甚至是 Java API 和指南,但都无济于事。总的来说,我似乎不知道如何将已经写入 JFrame 的代码合并到 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;
  }
} 
4

1 回答 1

2

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

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

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

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

我建议您将任何想要传递到内部类 final 的变量。但它必须在外部类中是最终的,而不是在内部类中:

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

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

于 2013-04-05T02:18:55.823 回答