2017-02-21 8 views
1

Ich möchte beginnen, über GUI in Java zu lernen. Wenn ich jedoch versuche, einen einfachen JFrame-Code von einer Lernprogramm-Website in Textpad zu kopieren, gibt es einen Fehler:Java GUI Methode Fehler

"C: \ Programmierung \ Java \ Praxis GUI \ GUIPractice.java: 7 : Fehler: ungültige Methodendeklaration; Rückgabetyp öffentlichen MyFrame() erforderlich { ^ 1 Fehler“

Dies geschieht auch, wenn ich auch einfache GUI-Code von anderen Webseiten kopieren, scheint Was das Problem zu sein? Ich weiß, dass eine Methode entweder void oder ein Rückgabetyp sein muss, aber warum gibt die Methode nicht an, ob void oder wenn Rückgabetyp, ein Datentyp? Dies scheint die Syntax von GUI-Code für andere Sites zu sein. Hier

ist der Code:

// 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(); 
    } 
} 

Ich habe versucht, dies mit der Netbeans IDE und der gleiche Fehler auftaucht. Was scheint das Problem zu sein?

+0

Sollte gut funktionieren. Keine Fehler in Ihrem Programm –

+0

diese "Methode" ist eigentlich ein Konstruktor und hat daher keinen Rückgabetyp. Aber: Ein Konstruktor muss genauso benannt werden wie Ihre Klasse. Es scheint etwas Verwirrung über Ihre Benennung zu geben: Der Fehler wird in einer Datei namens "GUIPractice.java" gemeldet, Ihr Quellcode gibt "file: EmptyFrame.java", die Klasse heißt eigentlich "MyFrame" - was nun korrekt ist Dateiname und Klassenname? –

+0

Es tut mir leid wegen der Verwirrung, aber ich habe den Code direkt von der Website kopiert. Ich habe den Klassennamen umbenannt, als ich nach Textpad kompiliert habe. – JPAsensi

Antwort

1

Ihre Klasse heißt MyFrame, befindet sich jedoch in einer Datei namens EmptyFrame.java. Sie müssen den gleichen Namen haben. Da sie unterschiedlich sind, denkt sie MyFrame() ist eine Methode.

+0

Sie müssen nur gleich benannt werden, wenn die Klasse öffentlich ist (was die Klasse im Beispiel nicht ist) –

+0

Aber dann würde er einen Fehler bekommen, eine statische Methode zu haben (dh statische void main()), die nur erlaubt ist in Top-Level-Klassen. –

+0

Sicher, eine statische Methode ist nur in einer Top-Level-Klasse zulässig. Klassen der obersten Ebene können jedoch öffentlich, geschützt oder nur Paket sichtbar sein. Und der Klassenname muss nur mit dem Dateinamen übereinstimmen, wenn die Klasse öffentlich ist. –

0

Ändern Sie GUIPractice.java in MyFrame.java oder ändern Sie den Klassennamen und den Konstruktor in GUIPractice.

+0

Es tut mir leid wegen der Verwirrung, aber ich habe den Code direkt von der Website kopiert, ich habe den Klassennamen umbenannt, als ich nach Textpad kompiliert habe. – JPAsensi

0

In jeder .java-Datei muss eine Klasse mit demselben Namen wie der Dateiname vorhanden sein, andernfalls wird zur Laufzeit ein ClassNotFoundException ausgelöst. Der Fehler, den Sie gesehen haben, ist ziemlich komisch. Ich weiß nicht, warum es sich über den Rückgabetyp eines Konstruktors beschwert.

Benennen Sie Ihre Datei einfach so um, dass sie denselben Namen wie die Klasse hat, d. H. MyFrame.java. Sie können auch Ihre Klasse public machen.

+0

Können Sie einen Link angeben, der diese Anforderung enthält? Soweit ich weiß, müssen nur öffentliche Klassen in Dateien mit demselben Namen gespeichert werden. (Obwohl es am besten ist, Klassen in ähnlich benannten Dateien zu platzieren, ist es nur für öffentliche Klassen erforderlich) –

+0

Ich habe es gerade getestet und eine 'ClassNotFoundException' wird ausgelöst. @ ThomasKläger – Sweeper

+0

Es tut mir leid wegen der Verwirrung, aber ich habe den Code direkt von der Website kopiert, ich habe den Klassennamen umbenannt, als ich nach Textpad kompiliert habe. – JPAsensi

0

Das Problem trat tatsächlich auf, nachdem ich den Code nach Textpad kopiert habe, benannte ich den Klassennamen in GUIPractice, um den Dateinamen zu entsprechen. Allerdings wusste ich nicht, dass die Methode, die den GUI-Code enthielt, keine Methode, sondern ein Konstruktor ist. Was mich jedoch verwirrt ist, warum sollte der Konstruktor den gleichen Namen wie der Klassenname haben.

+0

Nun, so nennt man Konstruktoren. Die [Java Language Specifiction] (http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.8) besagt: ** Der SimpleTypeName im ConstructorDeclarator muss einfach sein Name der Klasse, die die Konstruktordeklaration enthält, oder ein Kompilierungsfehler tritt auf. ** –

+0

Danke, eigentlich wusste ich das nicht, da wir immer noch im Thema Methoden in unserer Klasse sind. Vielen Dank – JPAsensi