# Fokus und JTextField



## Alex_winf01 (28. Jan 2008)

Hallo liebe Forengemeinde,

wie kann ich den Fokus in ein bestimmtes Textfeld legen, dass der Anwender gleich "losschreiben" kann?

Beispiel:

Anmelde-Dialog für eine DB. Der Anwender muss bei mir derzeit erst auf in das Textfeld Benutzername klicken. Ich möchte, dass das Programm gleich in diesem Feld steht. Wie kann ich das machen?


----------



## André Uhres (28. Jan 2008)

requestFocusInWindow


----------



## Ariol (28. Jan 2008)

requestFocus()


----------



## André Uhres (29. Jan 2008)

Ariol hat gesagt.:
			
		

> requestFocus()


_..developers are strongly encouraged to use .. [requestFocusInWindow] over requestFocus when possible. 
Code which relies on requestFocus may exhibit different focus behavior on different platforms._


----------



## Ariol (29. Jan 2008)

Ah, wieder was gelernt ;-)


----------



## Alex_winf01 (29. Jan 2008)

Klappt leider nicht. Der Anwender muss immer noch in das Textfeld klicken.

Hier mein Code:


```
JOpptionPane.showOptionDialog(null, pnl_mein, "DB-Anmeldung", JOptionPane.OK_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE, null, s_options)
```

pnl_main beinhaltet dann die Label und die Textfelder.


----------



## outbreaker (29. Jan 2008)

zeig mal deinen *pnl_mein* Code der wäre vielleicht auch hilfreich


----------



## Alex_winf01 (29. Jan 2008)

```
String[] s_options = {"Anmelden", "Abbrechen"};
JPanel pnl_main = new JPanel();
pnl_main.setLayout(new GridLayout(3,3,10,10));

JLabel lbl_username = new JLabel("Benutzername: ", JLabel.RIGHT);
txt_username = new JTextField();
txt_username.reqiestFocusInWindow();

JLabel lbl_password = new JLabel("Passwort: ", JLabel.RIGHT);
txt_password = new JPasswordField();

pnl_main.add(lbl_username, 0);
pnl_main.add(txt_username, 1);
pnl_main.add(lbl_password, 2);
pnl_main.add(txt_password, 3);
```

Ich möchte einfach nur, dass der Cursor sich im Textfeld Benutzername bei Aufruf befindet, damit der Anwender sofort mit der Eingabe beginnen kann.


----------



## outbreaker (29. Jan 2008)

mal eine andere Frage wo hast du gesehen das es diese Methode showOptionDialog mit den Parametern die du da beschrieben hast gibt?

API JOptionPane



> showOptionDialog(Component parentComponent, Object message, String title, int optionType, int messageType, Icon icon, Object[] options, Object initialValue)




ich habe nur diese Methodendefinition gefunden  :shock: 

nicht die die du verwenden möchtest


----------



## Ariol (29. Jan 2008)

requestFocusInWindow darf erst aufgerufen werden, wenn dein Textfeld schon sichtbar ist.


```
SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
               {
                     txt_username.reqiestFocusInWindow();
               }
        });
```


----------



## Ariol (29. Jan 2008)

outbreaker hat gesagt.:
			
		

> mal eine andere Frage wo hast du gesehen das es diese Methode showOptionDialog mit den Parametern die du da beschrieben hast gibt?
> 
> API JOptionPane
> 
> ...



Genau die verwendet er doch.


----------



## outbreaker (29. Jan 2008)

habe ich wohl nicht richtig hingesehen   

aber ein Argument fehlt am Ende trotzdem  :wink: das hat mich dann wohl verwirrt

so funktioniert es:


```
String[] s_options = {"Anmelden", "Abbrechen"};
JPanel pnl_main = new JPanel();
pnl_main.setLayout(new GridLayout(3,3,10,10));

JLabel lbl_username = new JLabel("Benutzername: ", JLabel.RIGHT);
JTextField txt_username = new JTextField();

JLabel lbl_password = new JLabel("Passwort: ", JLabel.RIGHT);
JTextField txt_password = new JPasswordField();

pnl_main.add(lbl_username, 0);
pnl_main.add(txt_username, 1);
pnl_main.add(lbl_password, 2);
pnl_main.add(txt_password, 3);
txt_username.requestFocusInWindow();

JOptionPane.showOptionDialog(null, (Object)pnl_main, "DB-Anmeldung", JOptionPane.OK_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE, null, s_options,null);
```

du musst das 
	
	
	
	





```
txt_username.requestFocusInWindow();
```
 weiter nach untenschieben nach dem hinzufügen


----------



## Alex_winf01 (29. Jan 2008)

Funktioniert leider nicht.


----------



## André Uhres (29. Jan 2008)

Alex_winf01 hat gesagt.:
			
		

> Funktioniert leider nicht.


Ich glaube mit JOptionPane kann das auch nicht funktionieren.
Die Komponente muss sichtbar sein, aber da der Dialog modal ist
kommt man auch mit invokeLater nicht zum Zug.
Wenn man sich den JDialog selbst macht, ist es aber kein Problem.
Beispiel: Login.java


----------



## outbreaker (29. Jan 2008)

Alex_winf01 hat gesagt.:
			
		

> Funktioniert leider nicht.



das verstehe ich nicht

Das ist meine Klasse und ich habe den Cursor sofort im Eingabefeld für den Benutzernamen


```
package testen;

import java.awt.GridLayout;

import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

public class T1 {

	public T1() {
		init();
	}
	
	private void init() {
		String[] s_options = {"Anmelden", "Abbrechen"};
		JPanel pnl_main = new JPanel();
		pnl_main.setLayout(new GridLayout(3,3,10,10));

		JLabel lbl_username = new JLabel("Benutzername: ", JLabel.RIGHT);
		JTextField txt_username = new JTextField();

		JLabel lbl_password = new JLabel("Passwort: ", JLabel.RIGHT);
		JTextField txt_password = new JPasswordField();

		pnl_main.add(lbl_username, 0);
		pnl_main.add(txt_username, 1);
		pnl_main.add(lbl_password, 2);
		pnl_main.add(txt_password, 3);
		txt_username.requestFocusInWindow();

		JOptionPane.showOptionDialog(null, (Object)pnl_main, "DB-Anmeldung", JOptionPane.OK_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE, null, s_options,null);
	}
	
	public static void main(String[] args) {
				new T1();
	}
}
```


----------



## André Uhres (29. Jan 2008)

Es funktioniert aber nur, wenn man keinen default Button setzt. So geht's nicht:
JOptionPane.showOptionDialog(..., "Anmelden");


----------



## Alex_winf01 (30. Jan 2008)

@ André Uhres

ich setze aber keinen default Button. Warum funzt das trotdem nicht?


----------



## André Uhres (30. Jan 2008)

Alex_winf01 hat gesagt.:
			
		

> @ André Uhres
> 
> ich setze aber keinen default Button. Warum funzt das trotdem nicht?


Was funzt nicht?


----------



## outbreaker (30. Jan 2008)

irgendwie verstehe ich das Problem hier nicht mehr  :roll:


----------



## André Uhres (30. Jan 2008)

outbreaker hat gesagt.:
			
		

> irgendwie verstehe ich das Problem hier nicht mehr  :roll:


Also, irgendwas scheint im Moment immer noch nicht zu funktionieren.
Das Problem ist aber, dass uns noch nicht genau gesagt wurde, was denn eigentlich noch nicht funktioniert


----------



## outbreaker (30. Jan 2008)

na dann bin ich mal gespannt auf das was noch kommt


----------



## CLSK (30. Jan 2008)

xxx.requestFocusInWindow() muss NACH dem setVisible(true) des Konstruktors stehen.


----------



## Alex_winf01 (30. Jan 2008)

Ich kann den Cursor immer noch nicht in das Textfeld setzen - das ist mein Problem.


----------



## André Uhres (30. Jan 2008)

Alex_winf01 hat gesagt.:
			
		

> Ich kann den Cursor immer noch nicht in das Textfeld setzen - das ist mein Problem.


Gut, das bringt uns schon ein Stückchen weiter.
Jetzt müssten wir noch wissen, um welchen Code es sich handelt. Ist es vielleicht dieser von outbreaker: T1 ?


----------



## Gast2 (30. Jan 2008)

Also der von outbreaker klappt bei mir ohne Probleme nur so nebenbei


----------



## Alex_winf01 (30. Jan 2008)

In der  Main-Methode habe ich:


```
StartFrame frm = new StartFrame("Ein Fenster");
		frm.setVisible(true);
txt_username.requestFocusInWindow();
		frm.setSize(400,400); // Größe des Fensters festlegen
		frm.pack();
		frm.setResizable(false); // verhindern, dass der Anwender die Größe des Fensters verändert
		frm.setExtendedState(JFrame.MAXIMIZED_BOTH); // auf Vollbildschirm schalten
```


----------



## Gast2 (30. Jan 2008)

1. du setzt net größe und danach machst du ein pack und dann wieder vollbildschrim---> was für ein Sinn ???
2. solltest du setVisible() nach deinen ganzen größen setzungen machen
3. du sollst das requestFocus.... nach dem add machen


----------



## Alex_winf01 (30. Jan 2008)

@ SirWayne

Auch dann funzt es nicht, wenn ich es an folgender Stelle mache:


```
String[] s_options = {"Anmelden", "Abbrechen"};
      JPanel pnl_main = new JPanel();
      pnl_main.setLayout(new GridLayout(3,3,10,10));

      JLabel lbl_username = new JLabel("Benutzername: ", JLabel.RIGHT);
      JTextField txt_username = new JTextField();

      JLabel lbl_password = new JLabel("Passwort: ", JLabel.RIGHT);
      JTextField txt_password = new JPasswordField();

      pnl_main.add(lbl_username, 0);
      pnl_main.add(txt_username, 1);
      pnl_main.add(lbl_password, 2);
      pnl_main.add(txt_password, 3);
      txt_username.requestFocusInWindow();
```

Funzt auch nicht.


----------



## Ariol (31. Jan 2008)

requestFocusInWindow() funktioniert nur, wenn die entsprechende Komponente schon sichtbar ist.

Du kannst es damit versuchen, das hat bei mir funktioniert:

```
SwingUtilities.invokeLater(new Runnable()
			{
				public void run()
				{
					txt_username.requestFocusInWindow()
				}
			});
```


----------



## André Uhres (31. Jan 2008)

SirWayne hat gesagt.:
			
		

> Also der von outbreaker klappt bei mir ohne Probleme nur so nebenbei


Das macht jetzt schon mindestens drei Leute, bei denen es funktioniert.
Wir können also erstmal davon ausgehen, dass es auch bei Alex_winf01 funktioniert.
Keine Ahnung, was das hin und her hier soll  :roll:


----------



## Gast2 (31. Jan 2008)

@ Alex_winf01  nicht einfach den Code der funktioniert und das Thema ist erledigt.....


----------



## outbreaker (31. Jan 2008)

nein es geht darum das man sich an dem Code auch mal orientieren könnte und nicht Fehler macht die vielleicht eindeutig in dem Codebeispielen nicht drin sind  :autsch: 

So war das wohl eher gemeint  :wink:


----------



## Parfy (7. Feb 2008)

Habe das auch mal überprüft, da ich das selbe Problem hatte bei mir lag es daran das man wirklich als Options selber ein Array übergeben muss und nicht einfach die vordefinierten Buttons. Erst dann funktioniert die ganze Sache. Bei anderen showxxx-Methoden kann man es übrigens generell vergessen.


----------



## Gast (8. Feb 2008)

gibt es keine einfachere methode bei einem Fenster was geöffnet wird die Kurcor in ein bestimmtest Feld zu stecken??


----------



## André Uhres (8. Feb 2008)

Gast hat gesagt.:
			
		

> gibt es keine einfachere methode bei einem Fenster was geöffnet wird die Kurcor in ein bestimmtest Feld zu stecken??


Doch: requestFocusInWindow     Beispiel: Login.java


----------



## CLSK (12. Feb 2008)

thx ... mit diesem run^^ funzt


----------

