# Fokus in ein Textfeld setzen funktioniert nicht



## Alex_winf01 (17. Jun 2008)

Hallo liebe Forengemeinde,

ich habe folgenden Code:


```
class IrgendeinListener implements ActionListener
{
      public void actionPerformed(ActionEvent e)
      {
         JLabel einLabel = new JLabel("Label");
         text = new JTextField(10);
         text.requestFocusInWindow();
       }
}
```

Die Variable text ist public static. Leider funktioniert es nicht, dass ich den Focus auf dieses Textfeld legen kann. Woran kann das liegen?

EDIT:

Vielleicht noch eine wichtige Info:


```
Object[] message = {"Name und Passwort eingeben:\", label, text};
```


----------



## SlaterB (17. Jun 2008)

das message-Objekt aus der wichtigen Info wird aber gar nicht im obigen Code verwendet?

bzw.: falls das Array vor dem Ausführen des obigen Codes deklariert wurde, 
dann wird beim Neusetzen der statischen test-Variable NICHT auch das dritte Feld im Array neu gesetzt

-------

wenn du text neu erstellst ist es nicht in der GUI eingebunden, vielleicht kann man solange auch keinen Focus drauf legen?

mit welchem Code fügst du es wann in die GUI ein?
poste idealerweise ein kleines ausführbares Programm


----------



## Alex_winf01 (17. Jun 2008)

```
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.*;
import java.util.*;
import java.sql.*;

class Test extends JFrame
{
	public static Container con1;
	public static JButton neuer_benutzer;
	public static JTextField anwender_name, code_text;
	public static JPasswordField pwd;
	
	public Test(String title)
	{
		super(title);
		class NeuerBenutzerListener implements ActionListener
		{
			/** Um reagieren zu können, muss die Klasse die Methode actionPerformed implementieren (kein Rückgabewert)*/
			public void actionPerformed(ActionEvent e)
			{
				/** anwender_label stellt das Label "Anwendername" dar**/
				JLabel anwender_label = new JLabel("Anwendername");
				anwender_name = new JTextField(10);
				/** passwort_label stellt das Label "Passwort" dar**/
				JLabel passwort_label = new JLabel("Passwort:");
				pwd = new JPasswordField(10);
				/** passwortbst_label stellt das Label "Bestätiung Passwort" dar**/
				JLabel passwortbst_label = new JLabel("Bestätigung Passwort:");
				/** passwortbst_pws nimmt die Bestätigung des Passwortes auf **/
				JPasswordField passwortbst_pws = new JPasswordField(10);
				/** code_label stellt das Label "kürzel" dar**/
				JLabel code_label = new JLabel("kürzel");
				code_text = new JTextField(5);
				/** message nimmt die Elemente für den Dialog auf**/
				Object[] message = {"Name und Passwort eingeben:\n", anwender_label, anwender_name, code_label, code_text, passwort_label, pwd, passwortbst_label, passwortbst_pws};
				
				int resp = JOptionPane.showConfirmDialog(null, message, "Neuen Anwender anlegen",
						JOptionPane.OK_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE);
				anwender_name.requestFocusInWindow();
			}
		}
		neuer_benutzer = new JButton("Neur Benutzer");
		con1 = getContentPane();
		con1.setLayout(new BorderLayout());
		con1.add(neuer_benutzer);
		neuer_benutzer.addActionListener(new NeuerBenutzerListener());
	}
	
	public static void main(String[] args) 
	{
		Test frm = new Test("Test");
		frm.setVisible(true);
		frm.setLocation(50, 50); // Location des Fensters setzen
		frm.setResizable(false); // verhindern, dass der Anwender die Größe des Fensters verändert
		frm.setExtendedState(JFrame.MAXIMIZED_BOTH); // auf Vollbildschirm schalten
		frm.pack();
	}
	
}
```


----------



## SlaterB (17. Jun 2008)

tja, dumme Situation,
erst wenn das JOptionPane fertig geschlossen ist,
iwrd
int resp = ..;
gefüllt,
der dahinterstehende Befehl erst danach ausgeführt, 
wenn alles schon vorbei ist 

und davor gehts anscheinend nicht, entweder generell nicht 
oder weil beim Erstellen des JOptionPanes ganz bestimmt noch der Focus neu auf den OK-Button gesetzt wird,

es funktioniert, wenn du einen Thread vor der Anzeige des Dialogs startest:
Runnable r = new Runnable() {
                    public void run() {
                        try
                        {
                            Thread.sleep(1000);
                        }
                        catch (InterruptedException e)
                        {
                            e.printStackTrace();
                        }

                        anwender_name.requestFocusInWindow();
                    }
                };
                new Thread(r).start();

oder eben doch den Dialog selber zusammenbauen und dann den Focus korrekt setzen


----------

