# Fokus Reihenfolge ändern



## Niki (16. Nov 2004)

Hallo!

Unter 1.3.x habe ich die Methode setNextFocusableComponent bei meinen gui-Komponenten verwendet. Diese Methode ist jedoch unter 1.4.x deprecated. Nun möchte ich den Code auf 1.4.x anpassen, habe jedoch bis auf den nicht sprechenden hinweis von der sun api documentation (use FocusTraversalPolicy) nichts gefunden. Kann mir jemand bitte helfen, wie ich die Focusreihenfolge unter 1.4.x ändern kann?

Danke schon im Voraus!


----------



## thE_29 (16. Nov 2004)

Ich sollte dazu mal was bei den FAQs reinschreiben ;>

Funktion mit static usw abwandeln wie du sie brauchst:

```
/****************************************************************************
   * Gibt die Reihenfolge der in order[] gespeicherten Componenten als FocusTraversalPolicy Objekt zurück
   * @param order  sind die Componenten in richtiger Reihenfolge und notfalls muss eine Typkonvertierung
   * mittels (JComponent) durchgeführt werden
   * @return  das Objekt mit dem man mit setFocusTraversalPolicy(FocsTraersalPolicy) und aktivieren mit
   * setFocusCycleRoot(true)
   ***************************************************************************/
  public static FocusTraversalPolicy getFocusTraversal(final JComponent order[])
  {
    FocusTraversalPolicy policy = new FocusTraversalPolicy()
    {
      java.util.List list = java.util.Arrays.asList(order);
      public java.awt.Component getFirstComponent(java.awt.Container
                                                  focusCycleRoot)
      {
        return order[0];
      }

      public java.awt.Component getLastComponent(java.awt.Container
                                                 focusCycleRoot)
      {
        return order[order.length - 1];
      }

      public java.awt.Component getComponentAfter(java.awt.Container
                                                  focusCycleRoot,
                                                  java.awt.Component aComponent)
      {
        int index = list.indexOf(aComponent);
        return order[ (index + 1) % order.length];
      }

      public java.awt.Component getComponentBefore(java.awt.Container
          focusCycleRoot,
          java.awt.Component aComponent)
      {
        int index = list.indexOf(aComponent);
        return order[ (index - 1 + order.length) % order.length];
      }

      public java.awt.Component getDefaultComponent(java.awt.Container
          focusCycleRoot)
      {
        return order[0];
      }

      public java.awt.Component getInitialComponent(java.awt.Window window)
      {
        return order[0];
      }
    };
    return policy;
  }
```


Aufruf:


```
/*Setzt die richtige Tabulatorenreihenfolge */
    FocusTraversalPolicy policy = getFocusTraversal(
        new JComponent[]
        {jbAE, jbBuAus, m_tab});

    setFocusTraversalPolicy(policy);
    setFocusCycleRoot(true);
```


----------



## Niki (16. Nov 2004)

Danke für so eine rasche Antwort. Das heisst ich müsste für die Methode setNextFocusableComponent jedesmal ein eigenes Policy Objekt erzeugen. Find ich nicht sehr angenehm.

Ich hab nur folgendes Problem. Ich hab in meinem Panel einige Komponenten, und möchte nur von wenigen die Reihenfolge ändern bzw. wird die Reihenfolge zur Laufzeit geändert wenn bestimmte ItemEvents gefeuert werden. Ich find generell das neue FocusHandling vom 1.4.x etwas verwirrend. Vor allem habe ich keine besonders gute Doku gefunden.


----------



## thE_29 (16. Nov 2004)

na, nix setNextFocusable

du hast deine Funktion (die getFocus...)

und dann sagst du den Aufruf


```
FocusTraversalPolicy policy = getFocusTraversal(
        new JComponent[]
        {JTextField1, JTextField3,JTextField2,....uswuswusw}); 
 setFocusTraversalPolicy(policy);
    setFocusCycleRoot(true);
```

so geht das, du sagst das 1mal net für jedes


----------



## Niki (16. Nov 2004)

Alles klar, das heisst ich setzte über die Policy einfach das Focusverhalten einmalig. Setze ich dann meinem Container die Policy? Dann hab ich eben das Problem, dass ich für alle Componenten die Reihenfolge festlegen will, wobei es nur 3 Komponenten von 10 betrifft. Und während der Laufzeit ändert sich eben auch die Reihenfolge bei bestimmten Ereignissen. Mit der setNextFocusable Methode war ich da wesentlich flexibler.


----------



## thE_29 (16. Nov 2004)

Jo, das kann schon sein und das nextfocusable geht zz auch noch, aber sun hat sich halt das FocusTraversal einfallen lassen...

Du könntest aber in einer 1 Funktion alle verschiedenen arten generieren lassen und dann nachher zuweisen (mehrere policies)


----------



## Niki (16. Nov 2004)

Ja, sowas hab ich eh im Sinn gehabt. Werd mir eine FocusPolicyFactory schreiben. Factories sind immer gut


----------



## Guest (28. Sep 2005)

hmmmm, kann man nicht auch einfach den container setzen und der fokus springt in der reihenfolge in die die objekte aufs panel geaddet werden?


```
// Fokus Cycle einschalten
jContentPaneStart.setFocusCycleRoot(true);
// Den Container erzeugen
ContainerOrderFocusTraversalPolicy policy = new ContainerOrderFocusTraversalPolicy();
// Das Pane für den Container aufsetzen
jContentPaneStart.setFocusTraversalPolicy(policy);	
// Und nun einfach die Komponenten auf das Pane hauen
jContentPaneStart.add(getJTextField(), null);
jContentPaneStart.add(getJTextField3(), null);
jContentPaneStart.add(getJTextField1(), null);
```

das klappt doch auch? zumindest bei mir, allerdings schmeisst er mir ne "to complicated" meldung raus.
bitte schreibt mal eure meinung dazu! ^^


----------



## thE_29 (28. Sep 2005)

Wenn man die ganze policy net setzt, dann hüpft er es horziontal /vertikal durch!

Also von oben links, nach unten rechts, gehen die Komponenten zeilenweise durch...

Und nicht wie man es draufadded!!


----------



## Gast (28. Sep 2005)

hm, hab ma grad inner beispielanwendung die adding-reihenfolge geändert und dann übersprint auch tatsächlich die umliegenden textfelder und setzt den fokus aufs textfeld ganz unten in der ecke. kann das sein?


----------



## thE_29 (28. Sep 2005)

Das is aber komisch...

Dachte mir immer, das der so der Reihenfolge nachspringt..


----------



## Gast (28. Sep 2005)

hm ok wir machens folgendermaßen:

ich bin grad auf der arbeit, aber wenn ich zu hause bin packs ichs ma aufn ftp und dann kannst ja ma schauen.

ich hab das nämlich ausm sun java forum aufgeschnappt:

Re: How do I use FocusTraversalPolicy?
1. Register your Container as FocusCycleRoot before add the components to it;

 jPanel1.setFocusCycleRoot(true);

2. Become the Container FocusTraversalPolicy;

 FocusTraversalPolicy focusPolicy = jPanel1.getFocusTraversalPolicy();

3. Add components to Container.

...
jPanel1.add(textField_);
..._


----------



## Gast (25. Okt 2005)

so, vielleicht kann ja jmd schaun obs da einwände gibt:

http://mitglied.lycos.de/WOLVERINE_MC/Start.java


----------

