2013-03-31 55 views
4

我花了數小時搜索,無法弄清楚如何解決此問題。也許我只是完全關閉了,但是我一直收到錯誤「不能引用在不同方法中定義的內部類中的非最終變量userInput」。如果有人可以幫我弄清楚爲什麼會發生這種情況,或者如何解決這個問題,這將不勝感激。使用JTextField時,無法引用內部類錯誤中的非最終變量

我得到2個編譯錯誤: 可以不是指一個非最終變量userInput在不同的方法中定義的內部類內部

無法指非最終變量inputField內側的內類以不同的方法定義

編輯:一些澄清,我想保持我的userInput變量不是最終的。

這裏是我的代碼,也許有人可以看到我做錯了,我省略了一切無關與此錯誤代碼:

//Import libraries 
... 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JTextField; 
import javax.swing.SwingConstants; 
... 

public class TextGame { 
public static void main(String[] args) throws FileNotFoundException { 

    ... 
    String userInput = "Input"; 
    ... 

    // Create the window 
    JFrame gameWindow = new JFrame("Game"); 
    gameWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    gameWindow.setVisible(true); 
    // Centre the window 
    gameWindow.setLocationRelativeTo(null); 

    ... 

    // Add input box to window 
    JTextField inputField = new JTextField(); 
    inputField.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      userInput = inputField.getText(); ****Here is where the error occurs*** 
     } 
    }); 

    gameWindow.add(inputField, BorderLayout.SOUTH); 

    // Size the window to what it contains 
    gameWindow.pack(); 
    ... 


} 
} 
+0

'userInput'是'main'的局部變量。它必須是一個實例或靜態(類)成員,然後Java才能讓您從「main」的上下文中的任何位置對其進行修改。在這種情況下,您可以將其設置爲'TextGame'上的字段(靜態或實例,具體取決於您是否打算使用該類的實例)。 – technomage

回答

0

我認爲你是在試圖訪問你的變量「userInput」在除聲明位置之外的類或方法之外,除非關鍵字前綴爲「final」,否則不能執行此操作,以便擴展變量的作用域。 例如。最終的字符串userInput;

+0

好的,但我需要變量不是最終的。有沒有什麼辦法可以解決這個問題,同時還有變量不是最終的? –

+0

它是您需要製作最終的文本字段,而不是字符串變量。 – camickr

+0

當我使文本字段最終,我得到一個錯誤,該變量必須是最終的。 –

5

要回答你的問題:

final JTextField inputField = new JTextField(); 

然而,一個更好的解決方案是從動作事件訪問文本字段:

JTextField textField = (JTextField)e.getSource(); 
userInput = textField.getText(); 
+0

當我這樣做時,我仍然得到了變量上的錯誤。即使我將變量更改爲final,然後我得到錯誤最終的局部變量userInput無法分配,因爲它是在封閉類型中定義的 –

+0

對不起,我沒有仔細查看代碼。問題是你正試圖在主要方法中構建你的GUI。相反,您應該創建一個擴展JPanel的自定義類。然後你可以定義類級別的變量(比如userInput)。然後,您只需將面板添加到JFrame。看看[如何使用標籤]上的Swing教程(http://docs.oracle.com/javase/tutorial/uiswing/components/label.html)。下載演示程序並像演示代碼一樣構建程序。 – camickr

+0

好的,我希望不那樣做,但似乎我必須這樣做。會改變,謝謝。 –

0

你正在創建內部匿名類的ActionListener的實例。如果這樣的類使用父類的變量,則所有這些變量都應該標記爲final。那是因爲這樣的變量是複製到內部類的自動生成構造函數。爲了避免副本的不協調變化,他們應該是不變的。

相關問題