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?
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
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
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?
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
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.
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
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?
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
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ß
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
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

