2013-04-05 72 views
0

以下程序的目標是要求用戶輸入一個電阻值,然後程序將爲每個數字輸出相應的顏色。因此這不包括所有數字。然而,該程序完成後,我試圖將JFrame作爲一個額外的東西進行整合,除非我掛斷瞭如何在動作偵聽器中打印相應的顏色。無法引用Action變量listener(Jframe)中的非變量

該行調用特定的方法,然後繼續打印顏色,除了如何將我的代碼和我的代碼的其餘部分合併到我的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] = 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

在Java中,您不能引用匿名內部類中的最終變量。您嘗試在ActionListener的匿名實現中訪問array3。你可以簡單地改變array3到最後,即:

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

此外,打印陣列的內容,您可以使用Arrays.toString()

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

這會打印出3種顏色,除了它打印出來(NULL, null,null) – 2013-04-05 02:06:27

+0

@SD您實際上並未在按鈕操作處理程序中執行任何計算。您需要像讀取「BufferedReader」輸入時那樣調用'values()'和'digitColours'。我不確定你爲什麼離開那個代碼。 – tenorsax 2013-04-05 04:53:32

+0

我會如何給他們打電話,如果你能幫助我,我願意給你打勾的標記? – 2013-04-05 21:22:16