Zum Inhalt springen

Probleme mit Window und Keylistener


Empfohlene Beiträge

Geschrieben

Hallo

Ich hab folgendes Programm abgeschrieben und wollte es so

modifizieren, dass es in einem Window (-später vielleicht JWindow)

läuft und mit der ESC-Taste verlassen werden kann.

 

public class HelloJava3Da extends Window implements KeyListener

{

	public HelloJava3Da()

	{

		super(new Frame());

		addKeyListener(this);

		setLayout(new BorderLayout());

		Canvas3D c3d = new Canvas3D(null);

		c3d.addKeyListener(this);

		add("Center",c3d);

		setSize(256,256);


		BranchGroup scene = createSceneGraph();

		scene.compile();


		SimpleUniverse simpleU = new SimpleUniverse(c3d);


		simpleU.getViewingPlatform().setNominalViewingTransform();


		simpleU.addBranchGraph(scene);

		show();

	}


	public BranchGroup createSceneGraph()

	{

		BranchGroup objRoot = new BranchGroup();

		objRoot.addChild(new ColorCube(0.4));


		return objRoot;

	}


	public static void main(String[] args)

	{

		new HelloJava3Da();

	}


	public void keyTyped(KeyEvent e)

	{

		System.out.println("Hallo");

	}

	public void keyPressed(KeyEvent e)

	{

		System.out.println("Hallo");

	}

	public void keyReleased(KeyEvent e)

	{

		System.out.println("Hallo");

	}

}

Kann mir jemand verraten, was ich falsch mache? - Ich versuche das jetzt seit

3 Stunden und komm aber nicht dahinter, warum er mir nicht Hallo ausgibt,

wenn ich im Window ne Taste drücke?

vielen dank im Voraus

Geschrieben

Hi,

Frame verarbeitet KeyEvents, Window nicht.

Window ist eine sehr rudimentäre Klasse, von der eigentlich nicht abgeleitet werden sollte. Dafür gibt es ja Frame.

Frame ist übrigens von Window abgeleitet. ;)

Gruß Jaraz

Geschrieben

Wie bekomm ich dann am einfachsten ein Fenster ohne Rahmen

oder ähnliches, das auf Mouse bzw. KeyEvents reagiert?

Kann ich ein Panel drauf legen, welches auf ein KeyEvent reagiert?

Geschrieben

Hm,

schwierig. Wenn es nur um die Escape Taste geht, könntest du dir bei Frame anschauen wie SUN den KeyListener implementiert hat und dein Window dementsprechend erweitern.

Ansonsten wüßte ich keine Möglichkeit.

Vielleicht noch mit Toolkit.getDefaultToolkit().getScreenSize() den Screensize holen und alles überlagern?

Gruß Jaraz

Geschrieben

Ok - danke

Muss ich mich wohl damit abfinden - werde wohl doch erstmal

einen Frame benutzen.

Kann das sein, dass das mal in früheren Versionen funktioniert

hat?

Weil im GoTo Java von Guido Krüger glaube ich, war so ein

Beispiel mit dabei.

Hab es eben bei mir ausprobiert - funktioniert aber

komischerweise auch nicht.

Weißt du da was genaueres?

Geschrieben

Huhu dein Problem ist einfach zu lösen...

Baue im Classen-Constructor einfach die folgenden paar Zeilen ein...


        addKeyListener(new java.awt.event.KeyAdapter() {

            public void keyPressed(java.awt.event.KeyEvent evt) {


                // Wenn ESC gedrückt wurde reagieren

                if(evt.getKeyCode() == evt.VK_ESCAPE) {

                    System.out.println("ESC gedrückt");

                }


            }

        });


Du musst natürlich die gewünschte Action einbauen.. Meine Version gibt nur nen String auf StdErr aus...

cheers,

Zork

Geschrieben

Genau das funktioniert ja nicht!

Zumindest in der 1.4-er Java Version!

Das hab ich doch versucht.

Ich bin aber auch der Meinung, dass es in früheren

Versionen funktioniert hat!

trotzdem danke

Geschrieben

Hm also Du machst was falsch....

Hier mein Beispiel mal als komplettes Programm... Läuft problemlos mit SDK 1.4.2


public class bla extends javax.swing.JFrame {


    public bla() {

        initComponents();


        setSize(300, 300);

    }



    private void initComponents() {


        addWindowListener(new java.awt.event.WindowAdapter() {

            public void windowClosing(java.awt.event.WindowEvent evt) {

                exitForm(evt);

            }

        });


        addKeyListener(new java.awt.event.KeyAdapter() {

            public void keyPressed(java.awt.event.KeyEvent evt) {

                // Wenn ESC gedrückt wurde reagieren

                if(evt.getKeyCode() == evt.VK_ESCAPE) {

                    System.out.println("ESC gedrueckt");

                }

            }

        });


        pack();

    }



    private void exitForm(java.awt.event.WindowEvent evt) {

        System.exit(0);

    }



    public static void main(String args[]) {

        new bla().show();

    }


}

cheers,

Zork

Geschrieben

Moment mal - das ist aber ein JFrame!

Ich wollte ein JWindow oder ein Window haben.

Dass es bei einem Frame bzw. JFrame funktioniert weiß ich ja,

ich hätte es aber gerne für ein Window oder JWindow!

Geschrieben

Sodele.... ich habe mich mal schlau gemacht.... java.sun.com.

Es ist nicht möglich einem Window oder JWindow einen KeyEvent verarbeiten zu lassen! JFrame oder JInternalFrame können das. Sprich Du musst Dein Proggi darauf umstellen.

cheers,

Zork

Geschrieben
Original geschrieben von Krain

Kann das sein, dass das mal in früheren Versionen funktioniert

hat?

Weil im GoTo Java von Guido Krüger glaube ich, war so ein

Beispiel mit dabei.

Hm, ich habe nur die aktuelle Version und da habe ich KeyListener nur mit JFrames gesehen.

Original geschrieben von Zork

Sodele.... ich habe mich mal schlau gemacht.... java.sun.com.

Es ist nicht möglich einem Window oder JWindow einen KeyEvent verarbeiten zu lassen! JFrame oder JInternalFrame können das. Sprich Du musst Dein Proggi darauf umstellen.

Die Erkenntnis besteht schon seit dem 2.ten Beitrag in diesem Thread. Das nächste mal vielleicht nicht nur die Frage lesen. ;)

Gruß Jaraz

Geschrieben
Original geschrieben von Jaraz

Hi,

Frame verarbeitet KeyEvents, Window nicht.

Window ist eine sehr rudimentäre Klasse, ...

Gruß Jaraz

kannst du das mal erläutern, denn Window erbt ja von java.awt.Component

die methode addKeyListener(KeyListener l) ?

Geschrieben
Original geschrieben von stevg

kannst du das mal erläutern, denn Window erbt ja von java.awt.Component

die methode addKeyListener(KeyListener l) ?

Ja, aber der KeyListener ist mit dem Focus gekoppelt und das Focusmanagent funktioniert nur im Frame halbwegs.

Man könnte für einen Splash Screen übrigens auch Frame.setUndecorated(true) oder so ähnlich nehmen.

ungetested!!!

Gruß Jaraz

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...