2017-02-21 59 views
1

我想開始學習關於java中的GUI。但是,當我嘗試從教程網站將簡單的JFrame代碼複製到Textpad並且嘗試編譯它時,出現錯誤:Java GUI方法錯誤

「C:\ Programming \ Java \ Practice GUI \ GUIPractice.java:7 :錯誤:無效的方法聲明,返回類型需要 公共MyFrame(){ ^ 1錯誤」

也會發生這種情況時,我也從其他網站複製簡單的GUI代碼,似乎是什麼問題?我知道一個方法必須是無效的或返回類型,但爲什麼該方法不指定是否爲void或返回類型,一個數據類型?這似乎是其他網站的GUI代碼的語法。

下面是代碼:

// file: EmptyFrame.java 
// Adapted from Core Java, vol.1, by Horstmann & Cornell 

import javax.swing.*; 

class MyFrame extends JFrame { 
    public MyFrame() { 
    setTitle("My Empty Frame"); 
    setSize(300,200); // default size is 0,0 
    setLocation(10,200); // default is 0,0 (top left corner) 
    } 

    public static void main(String[] args) { 
    JFrame f = new MyFrame(); 
    f.show(); 
    } 
} 

我試圖與NetBeans IDE和同樣的錯誤出現。 什麼似乎是問題?

+0

應該正常工作。程序中沒有錯誤 –

+0

這個「方法」實際上是一個構造函數,因此沒有返回類型。但是:構造函數需要像你的類一樣命名。您的命名似乎存在一些混淆:錯誤在名爲「GUIPractice.java」的文件中報告,您的源代碼給出「file:EmptyFrame.java」,該類實際上稱爲「MyFrame」 - 現在是正確的文件名和類名? –

+0

對於混淆,我很抱歉,但我直接從網站複製了代碼,實際上我在編譯到Textpad時將其重命名爲類名。 – JPAsensi

回答

1

你的類被稱爲MyFrame,但它在一個名爲EmptyFrame.java的文件中。他們需要是同一個名字。因爲它們不同,它認爲MyFrame()是一種方法。

+0

他們只需要命名相同,如果該類是公開的(其中類是不是) –

+0

但是,然後他會從一個靜態方法(即靜態void main())得到一個錯誤,這是隻允許在頂級課程中。 –

+0

當然,一個靜態方法只允許在頂層類中使用。但頂級類可以是公共的,受保護的或者只有包可見。如果類是公共的,類名只需要匹配文件名。 –

0

將GUIPractice.java更改爲MyFrame.java或將類名和構造函數更改爲GUIPractice。

+0

對於混淆,我很抱歉,但我直接從網站複製代碼,實際上我在編譯到Textpad時將類名重命名。 – JPAsensi

0

在每個.java文件中,必須有一個與文件名同名的類,否則將在運行時拋出一個ClassNotFoundException。你看到的錯誤很奇怪。我不知道爲什麼它抱怨構造函數的返回類型。

只需重命名您的文件,使其具有與該類相同的名稱即MyFrame.java。你也可以讓你的課程public

+0

您可以提供一個鏈接,說明這個要求嗎?據我所知,只有公共類需要駐留在具有相同名稱的文件中。 (雖然最好的做法是將類放在類似命名的文件中,但只需要公共類) –

+0

我剛剛對它進行了測試,拋出了一個'ClassNotFoundException'。 @ThomasKläger – Sweeper

+0

對於混淆,我很抱歉,但我直接從網站複製代碼,實際上我在編譯到Textpad時將類名重命名。 – JPAsensi

0

問題實際上是自從我將代碼複製到Textpad後,我將類名重命名爲GUIPractice以匹配文件名。但是,我不知道包含GUI代碼的方法實際上不是方法,而是構造函數。 但是,讓我感到困惑的是爲什麼構造函數應該和類名稱一樣。

+0

那麼,那就是構造函數是如何命名的。 [Java Language Specifiction](http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.8)指出:** ConstructorDeclarator中的SimpleTypeName必須是簡單的包含構造函數聲明的類的名稱,或發生編譯時錯誤** –

+0

謝謝,實際上,我不知道這一點,因爲我們仍然在我們班的Methods中。謝謝 – JPAsensi