2014-03-13 44 views
-1

當我試圖運行這個Java程序,使一個JTextField:爲什麼我不能調用創建對象的公共方法?

import java.awt.*; 
import javax.swing.*; 

public class TextField1 extends JFrame{ 
    private final int WIDTH = 320; 
    private final int HEIGHT = 250; 
    private FlowLayout flow = new FlowLayout(); 
    private JTextField myOutput = new JTextField(); 

    public TextField1() { 
    super("My TextField Example"); 
    setSize(WIDTH, HEIGHT); 
    setLayout(flow); 
    JTextField myOutput = new JTextField(20); 
    add(myOutput); 
    setVisible(true); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    public void createGUI(){ 
    myOutput.setText("I am a text field showing output!"); 
    myOutput.setEditable(false); 
    } 

    public static void main(String[]args) { 
TextField1 myTextField = new TextField1(); 
myTextField.createGUI(); 
System.out.println(myTextField.myOutput.getText()); 
    } 
} 

看來,如果不註冊createGUI()方法。你能解釋這是爲什麼嗎?

+1

我強烈建議改變你的文章的標題,聽起來更像是一個誇誇其談比回答的問題。此外,請在此處**發佈相關代碼**。 –

+1

此代碼正常工作。我可以按原樣運行它。 –

+0

「看起來好像它沒有註冊createGUI()方法。」什麼讓你有那個想法?你是否收到編譯錯誤?運行時錯誤?發生了一些事情,但這不符合你的期望?如果是這樣,發生了什麼,你認爲應該發生什麼? –

回答

5

在構造函數中,您正在創建一個名爲myOutput的新變量,它與上面聲明的實例變量不同。 JTextField myOutput應該myOutput

編輯:

您聲明方法本地變量myOutput並將其添加到您的框架。 createGUI()使用實例變量在類的頂部聲明,因此它不會影響幀中的TextField

+0

這不回答問題。 –

+0

這工作,謝謝你的幫助! – DelleVelleD

+0

@RossDrew它只是不直接。也就是說,這個問題問的是錯誤的東西,因爲它沒有被調試或記錄以顯示該方法實際正在執行。 –

0

我只是擴大了blueygh2提供的答案。主要問題是:
你有沒有考慮到JTextField的類中的尺寸將默認

private JTextField myOutput = new JTextField();//no size specified 
在構造

而且您聲明具有相同名稱的另一個JTextField中,將符合垃圾是0創建對象後集合:

JTextField myOutput = new JTextField(20); 

現在有2個解決方案:
1>指定類定義,就像JTextField的大小:

JTextField myOutput = new JTextField(20); // new object created for JTextField 

2>不要在構造函數創建一個新的JTextField對象,如:

myOutput = new JTextField(20); 
相關問題