# Applet automatisch den Focus geben, wenn Seite geladen ?



## kopfsalat (10. Mrz 2005)

Hi.
Ich finde gerade keine Möglichkeit, dass mein Applet direkt wenn die HTML-Seite fertig geladen ist den Focus (für z.B. die Tasteneingabe) erhält. Läßt sich das irgendwie ggf. von außen per JavaScript oder so erzwingen ?
Derzeit muss man immer erst einmal ins Applet klicken (FireFox + IE).


----------



## L-ectron-X (11. Mrz 2005)

Hm, habs noch nicht probiert.
Die requestFocus()-Methode tuts nicht?


----------



## kopfsalat (11. Mrz 2005)

Hilft leider nicht.

Hier ein Beispiel-Applet (zeigt einfach bei jedem Tastendruck eine neue Zufallszahl an):

```
import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class AppletFocusTest extends Applet
{
    private int num = 0;
    
    public void init()
    {
        addKeyListener(new KeyAdapter ()
        {
            public void keyReleased (KeyEvent e)
            {
                num = (int) (Math.random() * 100000);
                update(getGraphics());
            }
        });
        
        requestFocus();                     // keine Auswirkung
        requestFocusInWindow();             // keine Auswirkung
    }
    
    public void start()
    {
        requestFocus();                     // keine Auswirkung
        requestFocusInWindow();             // keine Auswirkung
    }
    
    public void paint (Graphics g)
    {
        g.setColor(Color.WHITE);
        g.fillRect(0,0, getWidth(), getHeight());
        
        g.setColor(Color.BLUE);
        g.drawString("Zufallszahl : " + num, getWidth()/2-50, getHeight()/2-10);
    }
}
```

Und hier HTML-Code für die Einbindung:


```
<html>
<head>
<title>AppletFocusTest-Applet</title>
</head>
<body>
<applet code="AppletFocusTest.class" width="400" height="300">
</applet>
</body>
</html>
```

Man muss trotzdem noch jedes Mal, wenn die Seite geladen ist, erst einmal ins Applet klicken, um diesem den Fokus zu geben. Vielleicht ist das eine "Sicherheitsmaßnahme", oder eher "Sicherheitsschikane" der Browser ?
Gut wäre auch sowas wier JavaScript "document.Appletname.focus()", aber sowas scheint es ebenfalls nicht zu geben.


----------



## kopfsalat (11. Mrz 2005)

Jawoll! Ich habe eine Lösung (aus 2 Teilen) gefunden!

1) Man füge requestFocus() an das Ende innerhalb der >>paint() - Methode<<.
Es scheint so, als wird nach dem Aufruf von init() und start() dem Applet der Fokus nochmal entrissen, so dass dort requestFocus() nix bringt, aber wenn dann abschließend die paint()-Methode aufgerufen wird, nicht mehr. In einer leeren Internetseite klappt das nun wunderbar mit IE und FireFox. Allerdings kann es natürlich durchaus sein, dass z.B. durch ein langsames Laden von anderen Bildern in der Seite oder ähnliches der Focus nachträglich wieder entrissen wird. Für diesen Fall greift dann 2:

2) Man baue den HTML-source z.B. nach folgendem Schema:


```
<html>
<head>
<title>AppletFocusTest-Applet</title>
</head>
<body onLoad="siteLoaded();">
<applet code="AppletFocusTest.class" name="myApp" width="400" height="300">
</applet>
</body>

<script type="text/javascript">
  function siteLoaded()
  {
    setTimeout("document.myApp.requestFocus()", 500);
    setTimeout("document.myApp.requestFocus()", 1000);
    setTimeout("document.myApp.requestFocus()", 1500);
  }
  siteLoaded();
</script>
</html>
```

document.myApp.requestFocus(); ruft die Funktion requestFocus() des Applets auf. Das ganze nennt sich glaube ich 'LiveWire', die Verknüpfung von JavaScript mit Applets (man kann Methoden auch Parameter übergeben, und Rückgabewerte erhalten) Klappt mit FireFox und IE.

Wird document.myApp.requestFocus() aber nur einmal bei 'onLoad' des <body> aufgerufen, funktioniert es nicht, irgendwas entreisst den Focus wieder. Aber mit ein paar Timeouts kann man sicherstellen, dass abschließend das Applet den Focus erhält. (Der nochmalige Aufruf von siteLoaded() ist nur nochmal zur nummer sicher).
Ebenso könnte man natürlich auch setIntervall() nutzen, aber dann könnte man keinem anderen Element in dieser Seite mehr den Fokus geben, da er dann immer wieder an das Applet geholt wird.
Auch könnte man vielleicht das Applet zusammen mit einem setIntervall in ein seperates Frame packen, welches nur das Applet enthält, denn sobald ein anderer Frame den Fokus hat, wird wahrscheinlich setIntervall aus dem Applet-Frame diesen nicht an sich reißen können...


=> so läßt sich also was basteln. Vielleicht reicht auch für die meisten Zwecke lediglich Punkt 1) ? Man müßte mal noch testen, ob durch langsames Nachladen von Bildern oder anderen Frameinhalten der Fokus dem Applet wieder geraubt wird.

Kennst Du oder jemand anderes noch eine andere Lösung ?


----------

