# Probleme bei setModal(true)



## Oli (29. Okt 2010)

Hallo,

ich habe einen Dialog. Auf diesem liegt ein Panel. Dort werden dynamisch Buttons gelegt, die eine Auswahl repäsentieren. Nun möchte ich einen dieser Buttons fokussieren. 

Der Aufbau:

Eine Liste mit Objekten, dort ist eines als "aktiv" gekennzeichnet. Für jedes dieser Objekte einen Button auf das Panel packen. Wenn das aktive Objekt dran ist, den globalen Button "avtiveButton" auf Panel packen. Und diesen bitte fokussieren.

Es wird aber immer der erste Button fokussiert:


```
public PartienummernAuswahl(ArrayList<Partienummer> pns) {
		System.err.println("PARTIENUMMER WÄHLEN");
		this.pns = pns;
		setLayout(new BorderLayout());
		setUndecorated(true);
		init();
		
		if (activeButton != null) {
			activeButton.grabFocus();
			activeButton.requestFocus();
			System.out.println(activeButton.getName());
		}
		else {
			System.out.println("Active Button = null");
		}
		
		add(mainPanel, BorderLayout.CENTER);
		pack();
		Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
		int x = (int) (screenSize.getWidth() - getSize().getWidth()) / 2;
		int y = (int) (screenSize.getHeight() - getSize().getHeight()) / 2;
		setLocation(new Point(x, y));
		setModal(true);
		setVisible(true);
		validate();
		repaint();
	}
```

Woran liegt das? setModal brauche ich zwingend, weil ich mit dieser Auswahl weiterarbeiten muss. Aber da liegt das Problem denke ich.

Weiß hier jemand Rat?


Danke Oli


----------



## Marco13 (29. Okt 2010)

Spontan würde ich ganz undetermnistisch-geraten mal sehen, was passiert, wenn man das mit dem Focus-Setzen ganz am Ende macht... Ansonsten mal genauer schauen....


----------



## SlaterB (29. Okt 2010)

was läßt dich vermuten, dass setModal() etwas damit zu tun hat, so dass gleich der Titel so lautet?

requestFocus() funktioniert glaube ich nur wenn der Dialog schon visible ist, müsste also nach setVisible(true) stehen,
vielleicht gar sehr viel später da der Dialog erst nebenläufig von einem anderen Thread angezeigt wird,
insofern ist setModal() tatsächlich ein Problem, blockiert nämlich den Aufrufer nach dem setVisible(true)-Aufruf,

du könntest vorher einen Thread starten der 100 ms oder so wartet..

------

oder bessere Focus-Befehle verwenden, 
How to Use the Focus Subsystem (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Other Swing Features)
schon gelesen und verstanden?

```
//This button will have the initial focus.
button.requestFocusInWindow();
```
fällt mir dort auf, das klingt besser, auch im Voraus zu setzen


----------



## Oli (29. Okt 2010)

Danke, 

aber das hab ich schon überall versucht...


Leider ohne erfolg.

Selbst wenn ich im Window Listener in windowOpened ein syso mit "hallo" mache kommt des net an...

Schon recht seltsam, find ich...


----------



## SlaterB (29. Okt 2010)

mein Posting übersehen?


----------



## Oli (29. Okt 2010)

Hallo SalterB,

jo, die Antwort galt fürs Posting von Marco...


Aber ich hab jetzt deine Lösungsansätze versucht, leider auch das ohne Erfolg.

Was meinst du mit einen Thread starten, der 100ms wartet?

Thread.sleep vor dem setModal?


----------



## SlaterB (29. Okt 2010)

ich meine damit einen Thread zu starten, 
Thread.sleep() != Thread starten


----------



## Oli (29. Okt 2010)

Versteh ich nicht ganz, was soll denn der Thread machen?

Und wo soll ich ihn starten?

Danke Oli


----------



## SlaterB (29. Okt 2010)

der Thread könnte wie gesagt nach 100ms requestFocus(); ausführen, weil es vorher nichts bringt,
starten irigendwo da in dem Bereich

ist aber das Thema überhaupt noch offen? 'Erledigt' ist markiert


----------

