Supportnet Computer
Planet of Tech

Supportnet / Forum / Anwendungen(Java,C++...)

KeyAdapter oder KeyListener





Frage

Moin, hab da noch mal ein Problem in Java, und zwar folgendes: Hab einfach eine kleine Applikation, die ein Fenster anzeigt, welches darauf wartet, per ESC geschlossen zu werden. Ich hab drei Klassen, einmal Example, einmal MainFrameGUI und einmal MainFrameCommand. Wie die Namen schon sagen, realisiert die GUI-Klasse nur die Oberfläche während die Command-Klasse der Ereignishandler für keyPressed ist. Example instanziert nur die beiden Klassen. Damit soll eine Trennung von Oberfläche und Code erreicht werden. MainFrameGUI ist demnach von Frame abgeleitet. MainFrameCommand implementiert das Interface KeyListener. So weit so gut. Mein Problem bzw. meine Frage: Man kann doch auch die Klasse MainFrameCommand anstatt KeyListener zu implementieren von KeyAdapter ableiten, so dass ich nicht behandelte Ereignisse (hier: keyReleased und keyTyped) nicht in Form von leeren Methodenrümpfen in der Klasse stehen habe. Nur das funktioniert bei mir nicht. bekomme dann zur Laufzeit die Fehlermeldung: "Exception in thread "main" java.lang.NoSuchMethodError: main". Was mache ich falsch? Hier der Code: [code] import java.awt.*; import java.awt.event.*; public class Example1801 { public static void main(String[] args) { MainFrameCommand cmd = new MainFrameCommand(); MainFrameGUI gui = new MainFrameGUI(cmd); } } class MainFrameGUI extends Frame { public MainFrameGUI(KeyListener cmd) { super("Nachrichtentransfer"); setBackground(Color.lightGray); setSize(300,200); setLocation(200,100); setVisible(true); addKeyListener(cmd); } public void paint(Graphics g) { g.setFont(new Font("Serif",Font.PLAIN,18)); g.drawString("Zum Beenden bitte ESC drücken...",10,50); } } class MainFrameCommand extends KeyAdapter { public void keyPressed(KeyEvent event) { Frame source = (Frame)event.getSource(); if (event.getKeyCode() == KeyEvent.VK_ESCAPE) { source.setVisible(false); source.dispose(); System.exit(0); } } } [/code] Gruß und vielen Dank im Voraus

Antwort 1 von semi

Läuft doch einwandfrei.
Ist alles in einer Datei Example1801.java?


Antwort 2 von semi

OK, sieht so aus, dass es eine Frage war, die keiner Antwort bedarf. Wie so viele in der letzten Zeit.



Antwort 3 von Javaneuling

Hallo, tut mir leid, dass ich jetzt erst wieder antworte, aber ich kann von zu hause nicht ins Internet, nur von der Arbeit aus!

Zu dem Problem: bei mir funktioniert es trotzdem nicht, aber ich habe gemerkt, dass es bei mir einen Unterschied macht, ob ich die öffentliche Klasse am Anfang hinschreibe oder zum Schluss. kann das sein? Oder vielleicht liegts auch einfach nur an meinem Programm (Jcreator 3), was mir schonmal am Anfang Probleme bereitet hat.

Ich bin glaub ich zu doof dafür

Antwort 4 von mr_x_hacker

Stimmt, läuft alles wunderbar...
Es macht normal keinen Unterschied, ob die public-Klasse am Anfang oder am Ende steht, wohl aber, WELCHE Klasse public ist...
Wie also Semi schon sagte, die Datei muß den Namen der public-Klasse haben!

Folgendes Vorgehen muss auf jeden Fall klappen:
- Lege mit einem Texteditor eine Datei "Example1801.java" an, und kopiere Deinen Code von oben da rein.
Führe in der DOS-Box aus:
- javac Example1801.java
- java Example1801
Jeweils natürlich im Verzeichnis wo die Example1801.java gespeichert ist.

Dann läuft es, und somit wird es eher an der Konfiguration im JCreator liegen wenn es da nicht läuft...

Ciao Sascha

Antwort 5 von Javaneuling

Verdammt es ist kaum zu glauben, so geht es!

Jetzt müsste ich nur noch wissen, was ich im JCreator falsch eingestellt habe, werd ich wohl mal auf der HP gucken oder mich doch mit einem Text-Editor begnügen müssen, ärgerlich! Oder kennt jemand das Problem mit dem JCreator?

Antwort 6 von mr_x_hacker

Also ich hab mir nu den JCreator 3.00 mal gezogen, eine Datei Example1801.java angelegt, Deinen Code da rein kopiert, und compiliert und ausgeführt - geht alles prima wie es soll :-)

Wo jetzt also das Problem ist...? *grübel*

Ciao Sascha

Antwort 7 von Javaneuling

Also erstmal danke für die Mühe, ich glaube das ist ein Bug im Programm, denn sobald ich das Programm neustarte funktioniert es.

Wenn ich nämlich zuerst das Beispiel mit der KeyListener-Klasse implementiere und ausführe gehts. Wenn ich dann allerdings den Quellcode in die Version mit KeyAdapter ändere und neu compiliere bekomme ich die Fehlermeldung. Doof ist auch, dass ich erst neu compilieren muss, damit ich die Class-File ausführen kann, sonst arbeitet der JCreator mit der alten Version weiter. Da wäre es vielleicht wünschenswert, wenn er fragen würde, ob mit alt oder neu. Aber darum gehts jetzt ja nicht.

Wüsste jetzt auch nicht, was ich falsch mache:
SDK 1.4.2 ist installiert, JCreator installiert, unter Options das SDK-Verzeichnis ausgewählt, das war's.

Antwort 8 von semi

Hol' Dir JDeveloper von Oracle. Kostet nix und kann alles. http://otn.oracle.com/products/jdev/

Antwort 9 von Javaneuling

Hört sich ja verlockend an, aber da muss ich mir vorher auch noch nen Account bei Oracle anlegen!

Antwort 10 von Javaneuling

Ok, hab mich jetzt einfach mal registriert und das Ding runtergeladen, mein erster Eindruck:
sehr laaangsam, scheint auch in Java programmiert zu sein.

Allerdings komme ich damit nicht klar. Ich muss da irgendwie ein Projekt oder so anlegen, kann einzelne java-files nicht ausführen, kann mir einer erklären wie das funktionieren soll?

Antwort 11 von semi

OK machen wir s mal an einem Beispiel.

1) Erstelle ein Verzeichnis, wo Deine Programme reinkommen
z.B.
c:\projekte

2) Erstelle ein Workspace und speichere es in diesem Verzeichnis.
z.B. als 'JavaExamples'

File->New...->Workspaces->Workspace

* Lass die Option "Add a new empty project" aktiv

3) Benenne die Projektdatei und speichere sie
z.B. 'HelloWorld'

4) Rechtsklick auf Projektdatei->
New->General->Simple Files->Java Class

Name: HelloWorld
Package: leer
"Generate Main-Method" aktivieren
OK

5) Im Sourcecode-Editor
Rechtklick->Run HelloWorld
---------------------------

Klingt sicherlich ziemlich umständlich, oder? :-)
Sobald Deine Programme aus mehr als nur der einen Klasse bestehen, wirst Du die Vorteile einer Projektdatei zu schätzen lernen.

Alternativ kannst Du all Deine Dateien in ein Verzeichnis kopieren, DOS-Fenster aufmachen und

javac -classpath .; -d . *.java

eintippen. Dann ist alles compiliert.

Stell Dir jetzt vor, Du hast ein Projekt mit mehreren Tausend Sourcecodedateien, die in zig unterschiedlichen Packages verteilt sind, zig JAR's und sonstiger Ressourcen verwenden (Grafik, XML etc.) und dazu noch aus einzelnen Teilprojekten bestehen. Da ist nix mit Kommandozeile. Wenn, dann mit Ant-Skripten.

Wenn Du all das nicht brauchst oder Dein Rechner etwas langsam ist, dann ist vielleicht JOE etwas für Dich.

Gruß,
Michael

Antwort 12 von semi

Übrigens, eine sehr gute Alternative ist auch das Eclipse-Projekt. Das ist aber eine andere Java-Welt. :)

Antwort 13 von Javaneuling

Ich danke euch für die Hilfe. JOE wird leider nicht mehr weiterentwickelt. Aber dort waren Links zu anderen Editoren angegeben; ich benutze jetzt den Editor Gel! Auch danke für die anderen Tipps und für die Anleitung, aber der JDeveloper war echt zu extrem für meine Kiste!

Gruß

Antwort 14 von semi

Vielleicht noch eine Empfehlung
ConTEXT Ist auch sehr schnell.
Du kannst Dir dort paar Benutzerbefehle, Makros etc. anlegen.
z.B. F9 compilieren, F11 Ausführen
Es ist auch ein sehr guter Ersatz für Notepad.

Gruß,
Michael

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Suche in allen vorhandenen Beiträgen: