KeyListener reagiert nicht

plammy

Bekanntes Mitglied
Hallo :) Diesmal habe ich kein kleines Testprogramm geschrieben statt mein kompletten komplizieren Code zu posten :)... Und bei meinem Programm funktioniert das nicht bei meinem Testprogramm auch nicht..
Es geht um KeyListener.. Als erstes will ich dass zumindest iwelchen Text auf der Konsole ausgegeben wird wenn ich z.B. die linke oder rechte Maustaste gedrückt habe... Später sollen Rechtecke mit den Maustasten bewegt werden.. Aber als erstes einfache Ausgabe... So ich das geschriebene habe tut sich nix.. Wird nichts ausgegeben ..

Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package javaapplication7;

import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class TestListener extends JPanel{
    
    
    KeyAdapt li = new KeyAdapt();
    
    public TestListener(){
        addKeyListener(li);
    }
    
    class KeyAdapt extends KeyAdapter {
        public void keyPressed(KeyEvent e)
        {
                   
            if(e.getKeyCode() == KeyEvent.VK_LEFT)
            {
                System.out.println("left");    
            
            }
            if(e.getKeyCode() == KeyEvent.VK_RIGHT)
            {
                System.out.println("right");             
            }
        }
    }
    
    public void paintComponent(Graphics g) {  
       super.paintComponent(g); 
       Rectangle r = new Rectangle(20,20,50,50);
       g.fillRect(r.x,r.y,r.width,r.height);
    }
    
    public static void main(String[] args) { 
    JFrame window = new JFrame("Test"); 
    window.setSize(360, 200); 
    window.setLocation(100, 100); 
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    window.getContentPane().add(new TestListener()); 
    window.setVisible(true); 
  } 
}
 
S

SlaterB

Gast
hast du je irgendwo ein Programm gesehen, das so funktioniert?
wie kommen die Leute nur immer darauf, das überhaupt so zu versuchen,
ist mir ein großes Rätsel ;)

mit
Java:
        TestListener tl = new TestListener();
        window.getContentPane().add(tl); 
        window.setVisible(true); 
        tl.requestFocus();
geht es vorerst,

aber allgemein nicht zu empfehlen,
auch wenn die Alternative KeyBindings auch nicht so direkt schön aussieht

How to Use Key Bindings (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Other Swing Features)
 

plammy

Bekanntes Mitglied
Und was ist wenn ich das für eine innere Klasse anwenden will?

Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package javaapplication7;

import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class TestListener extends JPanel{
    
    
    KeyAdapt li = new KeyAdapt();
    
    public TestListener(){
        
    }
    
    
    class IntereKlasse {
        
        public IntereKlasse(){
            super();
            addKeyListener(li);
            setFocusable(true); 
            requestFocus();
        }
    }
    class KeyAdapt extends KeyAdapter {
        public void keyPressed(KeyEvent e)
        {
                   
            if(e.getKeyCode() == KeyEvent.VK_LEFT)
            {
                System.out.println("left");    
            
            }
            if(e.getKeyCode() == KeyEvent.VK_RIGHT)
            {
                System.out.println("right");             
            }
        }
    }
    
    public void paintComponent(Graphics g) {  
       super.paintComponent(g); 
       Rectangle r = new Rectangle(20,20,50,50);
       g.fillRect(r.x,r.y,r.width,r.height);
    }
    
    public static void main(String[] args) { 
    TestListener tl = new TestListener();
    JFrame window = new JFrame("Test"); 
    window.setSize(360, 200); 
    window.setLocation(100, 100); 
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    window.getContentPane().add(tl); 
    window.setVisible(true); 
//    tl.requestFocus();
  } 
}

so klappts nicht
 
S

so0jvpwemm

Gast
Ich würde mir Slaters Vorschlag mit den KeyBindings zu Herzen nehmen. Mit KeyListener wirst Du in diesem Fall nicht glücklich werden.
 
S

so0jvpwemm

Gast
... abgesehen davon, dass Dein Panel mit dem KeyListener gar nicht im Frame verbaut ist.
 
S

SlaterB

Gast
IntereKlasse ist einfach nur eine innere Klasse, von dem nie ein Objekt erzeugt, ergo nie irgendwo addKeyListener() aufgerufen wird,
so kann freilich nichts passieren,

IntereKlasse ist im Moment auch kein JPanel, sehr fraglich im Sinn,
die Aufrufe gehen auf das TestListener-JPanel über

Listener ist übrigens ein eher schlechter Name für JPanel, welches nicht mal selber
ein Listener-Interface implementiert, was durchaus vorkommt

----

mein Code hatte schon seinen Grund, auch wenn ich ihn diesmal nicht in Worte fasste,
das requestFocus() muss NACH dem setVisible(true) passieren,

solange der Listener auf das JPanel tl geht, reicht Zeile 65 im Originalzustand,
ganz egal in wieviel Verschachtelungen intern der addKeyListener()-Aufruf erfogt, und ganz egal welche Subklasse den Listener darstellt,
das JPanel, auf dem gehört wird, ist wichtig
 
Zuletzt bearbeitet von einem Moderator:

plammy

Bekanntes Mitglied
außerdem muss ich das in der inneren Klasse machen :(. ich will methoden und variablen darin benutzen die sich in der innere Klasse nur befinden.
 
S

SlaterB

Gast
mit inneren Klassen oder nicht hat das nichts zu tun,

grundsätzlich besteht ein Unterschied, dass die Mausereignisse immer problemlos an genau die Komponente unter der Maus
weitergereicht werden (edit: bzw. bei gedrückter Maustaste an die vom Klick),
da besteht ein einfacher eindeutiger 'örtlicher' Zusammenhang,

wohin ein Tastendruck an die vielleicht 20 offenen Fenster auf den Desktop oder selbst mehrere Komponenten in einem JFrame
gehen soll ist nicht ganz so einfach, dafür kommt der Focus hinein,

KeyListener, das kann man sich merken, ist nur wirklich leicht und eindeutig, wenn irgendwo ein Cursor blickt, JTextField & Co.
(was auch den Focus beinhaltet), sonst lieber KeyBindings

> außerdem muss ich das in der inneren Klasse machen

ist wie gesagt kein Teil des Problems, wenn man es richtig macht,
falls du da Probleme hast, so benenne sie auch..,
das bisherige dürfte ausreichend weggefegt worden sein
 
Zuletzt bearbeitet von einem Moderator:

plammy

Bekanntes Mitglied
hmm.. ich glaube da komme ich echt weiter nur mit KeyBinding..
You're creating a custom component and want to support keyboard access to it.
For example, you might want the component to react when it has the focus and the user presses the Space key.

Genau das will ich.. ich will ja ein selectiertes Rechteck später mit der Pfeiltasten bewegen können.
 

plammy

Bekanntes Mitglied
ne also es kann nicht sein dass es nicht einfacher geht... in meinem testprogramm wo 60 zeilen und 1 panel ist ok hat geklappt dass man text auf der konsole ausgibt.. Aber.. erstmal ist mein ziel dass wenn man ein bestimmten rechteck selektiert hat DEn dann mit den taustasten bewegen kann... Es kann nicht sein, dass dman dafür iwelche Panel focusieren soll und soweiter.. Gibt es nicht iwelche Variante den rechteck zu selektieren (focusieren ) und dann zu bewegen mit Pfeiltasten?? wenn ich das versuche auf dem rechteck anweden geht das nicht weil der immer ein Component haben will und kein Rechteck:


Java:
package javaapplication7;

import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;


public class TestProgramm extends JPanel{

    EditPanel editPanel;
    
    public TestProgramm(){
        editPanel = new EditPanel();
        editPanel.setLayout(null);
        editPanel.setFocusable(true);
     
        editPanel.getInputMap().put(KeyStroke.getKeyStroke("LEFT"), "actionName");
        editPanel.getInputMap().put(KeyStroke.getKeyStroke("RIGHT"), "actionName");
        editPanel.getInputMap().put(KeyStroke.getKeyStroke("UP"), "actionName");
        editPanel.getInputMap().put(KeyStroke.getKeyStroke("DOWN"), "actionName");
        
        editPanel.getActionMap().put("actionName", new AbstractAction("actionName") 
        {
            public void actionPerformed(ActionEvent evt) {
                System.out.println(evt);
                repaint();
            }
        });
        
        
       add(editPanel);
    
    }
    
    class EditPanel extends JPanel{
        
        public EditPanel(){
            super();
        }
        
        
        public void paintComponent(Graphics g) {  
            super.paintComponent(g); 
            Rectangle r = new Rectangle(20,20,50,50);
            g.fillRect(r.x,r.y,r.width,r.height);
        }
        
     }
    public static void main(String[] args) { 
        TestProgramm tl = new TestProgramm();

        JFrame window = new JFrame("Test"); 
        window.setSize(360, 200); 
        window.setLocation(100, 100); 
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        window.getContentPane().add(tl); 
        window.setVisible(true); 

  } 
}
 
S

SlaterB

Gast
wenn du die Swing-Mechanismen nutzen willst, dann brauchst du auch eine richtige JComponent, die ein Rectangle darstellt,
und in einer größeren Fläche positioniert wird, dann geht auch ein Mausklick an dieses 'Rechteck-Komponente'

ein einfaches Rectangle für paintComponent ist aber praktisch nicht existent, da gibt es keine magischen Verknüpfungen,
für Swing sieht es nur so aus, dass es ein JPanel gibt, an welches die Keys (und auch die Maus!) gehen,
auf dem zufällig irgendwelche Pixel irgendeine Farbe haben,

wie das wann warum gezeichnet wurde, welche Instanzattribute dafür mal genutzt wurden und vielleicht noch da sind (oder als temporäre Variablen längst vergangen), das kann Swing unmöglich wissen/ interpretieren,

du selber kannst aber vieles programmieren was du möchtest, etwa über die MausListener indivuell merken,
welches Rectangle als letztes 'angeklickt' wurde, indem du den Mausklick mit der Lage aller Rechtecke vergleichst,
dann kannst du die Tastatureingaben je nach deinem gemerkten Wissen zur Verschiebung eines der Rechtecke nutzen,

all das musst du aber selber programmieren, wenn du mit paintComponent völlig frei die Anzeige bestimmst
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B KeyListener auf JFrame reagiert nicht AWT, Swing, JavaFX & SWT 8
T Event Handling KeyListener reagiert nicht AWT, Swing, JavaFX & SWT 10
S Keylistener reagiert bei Buttons nicht. AWT, Swing, JavaFX & SWT 8
A Keylistener reagiert nicht AWT, Swing, JavaFX & SWT 10
M AWT KeyListener reagiert nicht AWT, Swing, JavaFX & SWT 10
C Swing KeyListener reagiert nicht AWT, Swing, JavaFX & SWT 7
M KeyListener reagiert nach Buttondruck nicht mehr AWT, Swing, JavaFX & SWT 4
A JButton reagiert nicht auf KeyListener//Focuslistener AWT, Swing, JavaFX & SWT 4
G KeyListener reagiert nicht AWT, Swing, JavaFX & SWT 10
T KeyListener reagiert seltsam bei F10 (Systemtasten?) AWT, Swing, JavaFX & SWT 5
P JTextfield Text durch Keylistener verändern AWT, Swing, JavaFX & SWT 4
N Keylistener & JComboBox AWT, Swing, JavaFX & SWT 5
B Swing JButton mit KeyListener AWT, Swing, JavaFX & SWT 3
H KeyListener funktioniert nicht AWT, Swing, JavaFX & SWT 1
Fridolin111 Der KeyListener Löst kein event aus AWT, Swing, JavaFX & SWT 6
N Mit KeyListener ein rechteck zeichnen AWT, Swing, JavaFX & SWT 9
S Swing JPanel nimmt keinen KeyListener an AWT, Swing, JavaFX & SWT 7
P JPanel KeyListener hinzufügen AWT, Swing, JavaFX & SWT 8
B Swing KeyListener auf Container? AWT, Swing, JavaFX & SWT 1
K KeyListener ohne JFrame AWT, Swing, JavaFX & SWT 9
C Keylistener funktioniert nicht AWT, Swing, JavaFX & SWT 1
T KeyListener funktioniert nicht wenn ich ein JButton hinzufüge AWT, Swing, JavaFX & SWT 1
A Event Handling Muss ich 'KeyListener' tasuend mal zufügen? AWT, Swing, JavaFX & SWT 7
S mit keylistener frame schliessen AWT, Swing, JavaFX & SWT 8
S KeyListener funktioniert nicht AWT, Swing, JavaFX & SWT 2
R KeyListener in mehreren Panels AWT, Swing, JavaFX & SWT 5
V Tastatur KeyListener für mehrere Buttons AWT, Swing, JavaFX & SWT 1
J JLabel Visible setzen in KeyListener AWT, Swing, JavaFX & SWT 13
X KeyListener AWT, Swing, JavaFX & SWT 0
L KeyListener für JDialog AWT, Swing, JavaFX & SWT 7
N KeyListener funktioniert nicht richitg AWT, Swing, JavaFX & SWT 4
Z SnakeGame Schlange per KeyListener bewegen! AWT, Swing, JavaFX & SWT 10
T KeyListener AWT, Swing, JavaFX & SWT 2
GianaSisters JFrame mit JInternalFrames, Keylistener-Problem AWT, Swing, JavaFX & SWT 9
7 KeyListener tastatur temporär blockieren AWT, Swing, JavaFX & SWT 7
7 AWT problem: KeyListener/ test im Label umändern AWT, Swing, JavaFX & SWT 4
B SWT Problem: Wie kann man für jede TableColumn einen eigenen KeyListener registrieren. AWT, Swing, JavaFX & SWT 1
U Mouse + Keylistener AWT, Swing, JavaFX & SWT 12
K ActionListener mit KeyListener AWT, Swing, JavaFX & SWT 7
J JWindow und keylistener AWT, Swing, JavaFX & SWT 1
F JavaFX KeyListener zum Fenster öffnen/schließen AWT, Swing, JavaFX & SWT 9
A Swing KeyEvent mit KeyListener und KeyAdapter kürzer schreiben AWT, Swing, JavaFX & SWT 7
D JTextArea auf KeyListener Command AWT, Swing, JavaFX & SWT 6
C KeyListener AWT, Swing, JavaFX & SWT 5
Doopy Event Handling KeyListener funktioniert nach Restart nicht mehr AWT, Swing, JavaFX & SWT 7
S KeyListener geht nicht AWT, Swing, JavaFX & SWT 12
C Swing KeyListener in JPanel AWT, Swing, JavaFX & SWT 2
A KeyListener Button wechseln & Programm beenden AWT, Swing, JavaFX & SWT 4
M Frage zu KeyListener bzgl. JApplet AWT, Swing, JavaFX & SWT 3
H Bild mit KeyListener verschieben AWT, Swing, JavaFX & SWT 2
C JTextField KeyListener AWT, Swing, JavaFX & SWT 6
Y KeyListener, GUI Thread, repaint AWT, Swing, JavaFX & SWT 7
bluerob Fehler bei Wertübermittlung über KeyListener AWT, Swing, JavaFX & SWT 3
E Swing KeyListener implementieren AWT, Swing, JavaFX & SWT 12
M KeyListener richtig implementieren AWT, Swing, JavaFX & SWT 3
T KeyListener AWT, Swing, JavaFX & SWT 4
R KeyListener in JWindow AWT, Swing, JavaFX & SWT 7
T BlueJ KeyListener AWT, Swing, JavaFX & SWT 7
Z KeyListener AWT, Swing, JavaFX & SWT 2
M Swing KeyListener in JTextfield AWT, Swing, JavaFX & SWT 4
C Swing KeyListener für JPanel funktioniert nicht AWT, Swing, JavaFX & SWT 8
VfL_Freak Swing KeyListener, um einen Dialog per ESC zu schließen AWT, Swing, JavaFX & SWT 6
D Problem mit KeyListener AWT, Swing, JavaFX & SWT 2
J KeyListener um auf CTRL-Enter zu reagieren AWT, Swing, JavaFX & SWT 2
L Snake in Java KeyListener Problem AWT, Swing, JavaFX & SWT 30
B "globaler" KeyListener? AWT, Swing, JavaFX & SWT 3
B JTable TableHeader KeyListener AWT, Swing, JavaFX & SWT 4
S Swing KeyListener und JList AWT, Swing, JavaFX & SWT 2
R KeyListener funzt nicht AWT, Swing, JavaFX & SWT 2
X KeyListener AWT, Swing, JavaFX & SWT 4
P KeyListener + Animation AWT, Swing, JavaFX & SWT 2
M Fokus für KeyListener AWT, Swing, JavaFX & SWT 9
V Problem mit KeyListener im Fullscreen-Modus AWT, Swing, JavaFX & SWT 2
K JFrame + KeyListener + Runnable = Fehler AWT, Swing, JavaFX & SWT 3
F Tastenabfrage (KeyListener) AWT, Swing, JavaFX & SWT 2
D KeyListener Problem bei JPanel wechsel AWT, Swing, JavaFX & SWT 2
S Swing JTree mit KeyListener AWT, Swing, JavaFX & SWT 2
L AWT KeyListener, requestFocus und KeyBindings AWT, Swing, JavaFX & SWT 8
E JFrame akzeptiert den KeyListener nicht AWT, Swing, JavaFX & SWT 3
F Swing Problem mit KeyListener||paintComponent() in JFrame AWT, Swing, JavaFX & SWT 12
P Swing KeyListener hört nur manchmal zu AWT, Swing, JavaFX & SWT 2
Screen Focus Problem , KeyListener, TextField , Key AWT, Swing, JavaFX & SWT 4
earlgrey_tea AWT KeyListener bekommt keine Signale AWT, Swing, JavaFX & SWT 3
L Problem mit KeyListener AWT, Swing, JavaFX & SWT 3
A KeyListener funktioniert nicht AWT, Swing, JavaFX & SWT 4
D KeyListener-Problem nach dem "Gedrückthalten" einer Taste AWT, Swing, JavaFX & SWT 10
B Swing Keylistener fuer Dialog-Buttons AWT, Swing, JavaFX & SWT 2
B KeyListener Strg+s AWT, Swing, JavaFX & SWT 5
D Globaler Keylistener AWT, Swing, JavaFX & SWT 4
M problem mit keylistener/textarea AWT, Swing, JavaFX & SWT 6
M KeyListener Problem unter Firefox AWT, Swing, JavaFX & SWT 2
L AWT KeyListener, Taste gedrückt halten AWT, Swing, JavaFX & SWT 12
M Komisches Verhalten: JCombobox mit KeyListener AWT, Swing, JavaFX & SWT 13
capgeti SWT KeyListener 2 Tasten Problem AWT, Swing, JavaFX & SWT 3
R KeyListener - welcher Komponente hinzufügen AWT, Swing, JavaFX & SWT 5
Developer_X AWT KeyListener wird nicht ausgeführt! AWT, Swing, JavaFX & SWT 3
N JFrame und KeyListener AWT, Swing, JavaFX & SWT 6
A AWT Button verhindert ausführung vom Keylistener AWT, Swing, JavaFX & SWT 4
R KeyListener hinzufügen AWT, Swing, JavaFX & SWT 7
T Swing KeyListener mit mehreren Objekten AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben