Fokus



  • setFocusTraversable() ist genau die Methode, die ich bräuchte.
    Aber die gibts erst seit 1.4.
    Gibts etwas vergleichbares unter Java 1.1 ?



  • Dann must du eben eine neue Klasse erstellen, die aus TextField abgeleitet ist und die Methode isFocusTracversable() überlagert und in dieser false zurückgibt. (Achtung - das funktioniert dann zwar auch in 1.1, aber die Methode ist eben deprecated, also solltest du zudem am besten auch gleich isFocusable() überlagern)



  • Das hat leider nichts gebracht. Wenn ich isFocusTraversable() überschreibe und immer false zurückgebe, dann kann ich den Fokus nicht mehr auf das TextField setzen. Der Fokus soll ja nur nicht aus dem TextField weitergegeben werden.



  • OK, das habe ich jetzt übersehen...
    Da wird dir unter 1.1 wohl nichts anderes übrigbleiben als die KeyEvents abzufangen... (Ich hoffe mal es funtioniert so)

    if(e.getKeyCode() == KeyEvent.VK_TAB) {
      //Hier die vervollständigung
    
      //Und hier die weitere Bearbeitung des Events abstellen
      e.consume();
    }
    


  • Deine Methode funktioniert leider auch nicht, weil das KeyEvent beim drücken von TAB nie ausgelöst wird. Beim drücken von TAB wird der Fokus sofort an die nächste Komponente weitergegeben. Ich müsste irgendwie unterdrücken, dass der Fokus weitergegeben werden kann.

    Langsam habe ich das Gefühl, dass das mit AWT überhaupt nicht realisierbar ist.



  • Ok also einen Workaround könnte ich dir vielleicht bieten:

    Registriere für das Textfield einen FocusListener und überschreibe die im Listener definierte focusLost()-Methode, so dass deine Wortvervollständigung greift und rufe anschließend auf das Textfield getFocus() auf. Damit sollte der Fokus im Textfield bleiben und du könntest deine (sozusagen) OnTABKey-Eigenschaft im FocusListener durchziehen. Das ist nur eine Idee - getestet habe ich es nicht.



  • Genau deine Idee habe ich bereits ausprobiert und sie funktioniert eigentlich auch. Allerdings hat sie einen riesen Haken:
    Der Fokus geht nicht nur beim Betätigen der TAB-Taste verloren, sondern auch, wenn der User mit der Maus in eine andere Komponente klickt. Diese Lösung würde also nur funktionieren, wenn ich irgendwie folgende Logik implementieren könnte: if(focusLost && focusWurdeDurchDrückenVonTABverloren)

    U.U. werde ich statt Tab eine andere Taste benutzen. Das ist zwar nicht mehr intuitiv aber langsam gehen mir die Ideen aus. 😞



  • Also normalerweise solltest du auch über das Drücken der TAB-Taste informiert werden. In welche Methode steht bei dir denn folgender Code?

    if(e.getKeyCode() == KeyEvent.VK_TAB) {
    

    Du musst das nämlich in keyPressed abfragen, weil keyTyped nur auf Tastendrücke von Zeichentasten reagiert.

    Ich habe mir jetzt mal schnell ein Beispiel geschrieben und bei mir funktioniert alles problemlos:

    TextField tf = new TextField("test");
    tf.addKeyListener(new KeyAdapter()
    {
      public void keyPressed(KeyEvent e)
      {
        if (e.getKeyCode() == KeyEvent.VK_TAB) {
          System.out.println("tab");
          e.consume();
        }
      }
    });
    add(tf);
    
    TextField tf1 = new TextField("test");
    add(tf1);
    

    Ich habe hier 2 Textfelder. Aus dem ersten komme ich mit TAB nichtmehr heraus.

    HTH

    btw.: Du solltest daran denken, dass man wenn man schon mit TAB den Fokus nichtmehr wechseln kann, wenigstens mit Umschalt+TAB weiterkommt.



  • Ich habe deinen Code 1:1 übernommen und bei mir funktionert es nicht.
    Es springt nur von einem Textfield ins andere ("tab" wird nie ausgegeben)
    Hier der Code:

    import java.awt.*;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyAdapter;
    
    public class Test extends Frame{
        public Test() {
            this.setLayout(new FlowLayout());
            TextField tf = new TextField("test");
            tf.addKeyListener(new KeyAdapter()
            {
              public void keyPressed(KeyEvent e)
              {
                if (e.getKeyCode() == KeyEvent.VK_TAB) {
                  System.out.println("tab");
                  e.consume();
                }
              }
            });
            add(tf);
    
            TextField tf1 = new TextField("test");
            add(tf1);
            this.pack();
            this.setVisible(true);
    
        }
    
        public static void main(String[] args) {
            new Test();
        }
    }
    


  • Ich habe deinen Code 1:1 übernommen und bei mir funktionert es nicht.
    Es springt nur von einem Textfield ins andere ("tab" wird nie ausgegeben)

    DAs ist mir jetzt schon fast unerklärlich. Wahrscheinlich wird's wohl am verwendeten OS bzw. der verwendeten VM liegen.
    Folglich wird das also nicht so leicht zu realisieren sein...


Anmelden zum Antworten