[Java] KeyListener auf JFrame

02/20/2014 22:28 Chicken17#1
Hey,
ich bekomms irgendwie nicht hin, dass der KeyListener auf meinem JFrame tut. So ist er eigentlich direkt auf der Form, aber es passiert nichts :confused:

[Only registered and activated users can see links. Click Here To Register...]

[Only registered and activated users can see links. Click Here To Register...]
02/21/2014 08:47 XxharCs#2
Das JFrame muss einen Focus haben, sonst geht es auf einer JFrame direkt nicht.

Code:
...
Container con = getContentPane();
con.setFocusable(true);
con.addKeyListener(MyListener);
...
02/21/2014 08:52 Aegir112#3
this.addKeyListener(Listener);

Wenn du JFrame in der Klasse extended hast.
02/22/2014 15:02 karlchen1#4
Wenn du möchtest, dass der KeyListener auch außerhalb des JFrames funktioniert (also das JFrame nicht im Fokus ist), dann kannst du das mit JNI machen, und einen nativen Keyboard Hook nehmen.
02/22/2014 19:17 Chicken17#5
Quote:
Originally Posted by XxharCs View Post
Das JFrame muss einen Focus haben, sonst geht es auf einer JFrame direkt nicht.

Code:
...
Container con = getContentPane();
con.setFocusable(true);
con.addKeyListener(MyListener);
...
Hab bei meinem JFrame eigentlich nen Hacken bei setFocusable gemacht, bloß im Quelltext steht das nirgends.
Hab mal den Key listener auf ein Label gesetzt, da funktioniert es.
Bloß das komische ist, dass ich ein paar Buttons hab und wenn ich auf die drauf drück die ne Funktion haben dann tut der Listener danach immer noch aber bei nem Druck auf die bei denen nichts passiert tut er danach nicht mehr.

Aber die werden ja auch noch belegt und wenn es dann tut ist das ja egal:)

@Karlchen, das brauch ich hier zwar nicht, aber bei einer anderen Funktion von meinem Programm ist das ziemlich nützlich! Danke :)
02/23/2014 18:59 .SkyneT.#6
Kleines Beispiel, vielleicht hilft es dir.

Code:
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;

public class MyFrame extends JFrame implements KeyListener
{
    public MyFrame()
    {
        this.addKeyListener(this);
        
        this.setSize(200,200);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setVisible(true);
    }

    @Override
    public void keyTyped(KeyEvent e) 
    {
        System.out.println(e.getKeyChar());
    }

    @Override
    public void keyPressed(KeyEvent e) 
    {

    }

    @Override
    public void keyReleased(KeyEvent e) 
    {

    }    
    
    public static void main(String[] args) 
    {
        MyFrame f = new MyFrame();
    }
}
Natürlich empfiehlt es sich die ganzen Listener in eine
eigene Klasse zu schreiben, wie gesagt soll das hier nur
ein kleines funktionierendes Beispiel sein.
02/25/2014 20:23 Chicken17#7
Quote:
Originally Posted by .SkyneT. View Post
Kleines Beispiel, vielleicht hilft es dir.

Code:
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;

public class MyFrame extends JFrame implements KeyListener
{
    public MyFrame()
    {
        this.addKeyListener(this);
        
        this.setSize(200,200);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setVisible(true);
    }

    @Override
    public void keyTyped(KeyEvent e) 
    {
        System.out.println(e.getKeyChar());
    }

    @Override
    public void keyPressed(KeyEvent e) 
    {

    }

    @Override
    public void keyReleased(KeyEvent e) 
    {

    }    
    
    public static void main(String[] args) 
    {
        MyFrame f = new MyFrame();
    }
}
Natürlich empfiehlt es sich die ganzen Listener in eine
eigene Klasse zu schreiben, wie gesagt soll das hier nur
ein kleines funktionierendes Beispiel sein.
Danke, so hätte ich es eigentlich auch gelöst, das Problem ist bloß, dass ich bei dem Code den ich über Netbeans erstellt bekomme nie weiß, wie ich diesen so bearbeiten kann, da dort im änderbaren Code kein JFrame so erstellt wird wie du es beschrieben hast :)

Aber ich habe eine Möglichkeit gefunden einen "globalen" Keylistener zu benutzten, danke an alle :)
02/25/2014 20:29 dowhile#8
Quote:
Originally Posted by Chicken17 View Post
Danke, so hätte ich es eigentlich auch gelöst, das Problem ist bloß, dass ich bei dem Code den ich über Netbeans erstellt bekomme nie weiß, wie ich diesen so bearbeiten kann, da dort im änderbaren Code kein JFrame so erstellt wird wie du es beschrieben hast :)

Aber ich habe eine Möglichkeit gefunden einen "globalen" Keylistener zu benutzten, danke an alle :)
Alle GUI-Objekte werden von NetBeans aber als Attribute angelegt. Im Konstruktor nach initComponents() kannst du dann noch deinen eigenen Code hinzufügen.
02/25/2014 23:29 Chicken17#9
Quote:
Originally Posted by dowhile View Post
Alle GUI-Objekte werden von NetBeans aber als Attribute angelegt. Im Konstruktor nach initComponents() kannst du dann noch deinen eigenen Code hinzufügen.
Und wie würde ich da zum Beispiel dem kompletten Frame einen KeyListener hinzufügen? Müsste man das im Konstruktor machen oder in den initComponents (geht ja indem man bei einem Objekt custom code oder so wählt und mit pre init kann man da ja dann neue Sachen hinzufügen die quasi für alles gelten können und nicht bloß für das eine Objekt, das man gewählt hat)?
02/26/2014 16:52 .SkyneT.#10
Quote:
Originally Posted by Chicken17 View Post
Und wie würde ich da zum Beispiel dem kompletten Frame einen KeyListener hinzufügen? Müsste man das im Konstruktor machen oder in den initComponents (geht ja indem man bei einem Objekt custom code oder so wählt und mit pre init kann man da ja dann neue Sachen hinzufügen die quasi für alles gelten können und nicht bloß für das eine Objekt, das man gewählt hat)?
Ein eigener KeyEventDispatcher sollte genügen.
Code:
public class MyFrame extends javax.swing.JFrame
{
   //[...]
    private class MyDispatcher implements KeyEventDispatcher
    {
        @Override
        public boolean dispatchKeyEvent(KeyEvent e)
        {
            if (e.getID() == KeyEvent.KEY_PRESSED) 
            {
                System.out.println(e.getKeyChar()+" pressed");
            } 
            else if (e.getID() == KeyEvent.KEY_RELEASED) 
            {
                System.out.println(e.getKeyChar()+" released");
            } 
            else if (e.getID() == KeyEvent.KEY_TYPED) 
            {
                System.out.println(e.getKeyChar()+" typed");
            }
            return false;
        }
    }

    public MyFrame()
    {
        initComponents();
        KeyboardFocusManager.getCurrentKeyboardFocusManager()
                            .addKeyEventDispatcher(new MyDispatcher());
    }
   //[...]
}