Talion
2004-03-21, 14:16:48
Zu eigenen Testzwecken und damit ihr nicht so viel Quellcode durchgucken "müsst", habe ich hier einmal ein kleines Programm geschrieben, bei dem das Problem sichtbar wird, dass ich auch bei einem größeren Programm habe. Es geht um Keylistener in Java.
import java.awt.event.*;
import javax.swing.*;
public class Key
{
public static void main(String args[])
{
new Key();
}
public Key()
{
JFrame frame = new JFrame();
frame.setBounds(100, 100, 200, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JTextField input = new JTextField();
keyl kl = this.new keyl();
// frame.addKeyListener(kl);
input.addKeyListener(kl);
frame.getContentPane().add(input);
frame.show();
}
class keyl extends KeyAdapter
{
public void keyPressed(KeyEvent e)
{
System.out.println(e);
}
}
}
Das Problem gibt es bei den deutlich eingerückten Zeilen, also
keyl kl = this.new keyl();
// frame.addKeyListener(kl);
input.addKeyListener(kl);
Wenn ich es so mache wie in diesem Beispiel, d.h. dem Textfeld input einen Keylistener hinzufüge (innere Klasse keyl), wird über System.out das KeyEvent ausgegeben, z.b. so etwas für die Taste F1:
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=112,keyText=F1,keyChar=Undefined key
Char,keyLocation=KEY_LOCATION_STANDARD] on javax.swing.JTextField[,0,0,192x173 [...]
Wenn ich nun aber den Listener statt dem Textfeld dem Frame zuweise, passiert gar nichts. Laut Javadoku erbt JFrame die Methode addKeyListener() von der Klasse Component, es gibt auch keinen Fehler beim Kompilieren. Wenn ich im init meiner inneren Klasse keyl irgendetwas ausgeben lasse, zeigt sich auch, dass sie normal initialisiert wird. Der Frame scheint einfach keine Ereignisse zu bemerken. Hat jemand eine Ahnung woran das liegen kann?
Im Endeffekt will ich nichts weiter, als dass man z.b. F1 drücken kann um die Hilfe aufzurufen, und das möglichst ohne dass ich es jeder einzelnen Komponente sagen muss. Geht das nicht?
import java.awt.event.*;
import javax.swing.*;
public class Key
{
public static void main(String args[])
{
new Key();
}
public Key()
{
JFrame frame = new JFrame();
frame.setBounds(100, 100, 200, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JTextField input = new JTextField();
keyl kl = this.new keyl();
// frame.addKeyListener(kl);
input.addKeyListener(kl);
frame.getContentPane().add(input);
frame.show();
}
class keyl extends KeyAdapter
{
public void keyPressed(KeyEvent e)
{
System.out.println(e);
}
}
}
Das Problem gibt es bei den deutlich eingerückten Zeilen, also
keyl kl = this.new keyl();
// frame.addKeyListener(kl);
input.addKeyListener(kl);
Wenn ich es so mache wie in diesem Beispiel, d.h. dem Textfeld input einen Keylistener hinzufüge (innere Klasse keyl), wird über System.out das KeyEvent ausgegeben, z.b. so etwas für die Taste F1:
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=112,keyText=F1,keyChar=Undefined key
Char,keyLocation=KEY_LOCATION_STANDARD] on javax.swing.JTextField[,0,0,192x173 [...]
Wenn ich nun aber den Listener statt dem Textfeld dem Frame zuweise, passiert gar nichts. Laut Javadoku erbt JFrame die Methode addKeyListener() von der Klasse Component, es gibt auch keinen Fehler beim Kompilieren. Wenn ich im init meiner inneren Klasse keyl irgendetwas ausgeben lasse, zeigt sich auch, dass sie normal initialisiert wird. Der Frame scheint einfach keine Ereignisse zu bemerken. Hat jemand eine Ahnung woran das liegen kann?
Im Endeffekt will ich nichts weiter, als dass man z.b. F1 drücken kann um die Hilfe aufzurufen, und das möglichst ohne dass ich es jeder einzelnen Komponente sagen muss. Geht das nicht?