# JOptionPane.showInputDialog im Vordergrund anzeigen



## jeipack (7. Dezember 2010)

Hi
Ich frage mit folgender Anweisung einen String nach:

```
String pfad = JOptionPane.showInputDialog("Geben Sie den Pfad an");
```

Das Problem ist nun, dass wenn diese Anweisung zum ersten mal aufgerufen wird der Abfragedialog nicht im Vordergrund ist.  Beim zweiten mal (und die male darauf) kommt er dann aber immer im Vordergrund. 

Gibt es eine Möglichkeit, dass es immer im Vordergrund angezeigt wird?

Mir ist noch aufgefallen, dass wenn ich es in einem Tool mach das sonst keine Fenster etc hat es gleich im Vordergrund kommt, bei meinem Tool erstelle ich aber zuerst ein TrayIcon, könnte es eventuell daran liegen?

Vielen Dank schonmal für die Hilfe
Grüsse
jeipack


----------



## benjamin10 (8. Dezember 2010)

Hallo,

hast du schon probiert, das dazugehörige Fenster als Parent-Component zu übergeben?
Sollte dann eigentlich nicht passieren, dass der Dialog im Hintergrund erscheint.


```
String pfad = JOptionPane.showInputDialog(parentFrame, "Geben Sie den Pfad an");
```

Gruß
Ben


----------



## jeipack (8. Dezember 2010)

Das ist es ja, es gibt kein dazugehöriges Fenster. Es gibt nur den SystemTray. Ich denke genau daher kommt dieser Fehler.


----------



## vfl_freak (8. Dezember 2010)

Moin,

dann versuch's einfach mal mit dem aufrufenden Fenster :


```
String pfad = JOptionPane.showInputDialog( this, "Geben Sie den Pfad an" );
```

Gruß
Klaus


----------



## jeipack (8. Dezember 2010)

Also hier habe ich es mal in meine Demo eingebaut. 
Zusätzlich hab ich die Klasse als JFrame gemacht und gibt 'this' dann als ParentComponent hinzu.


```
import javax.swing.* ;

import java.awt.* ;
import java.awt.event.* ;


public class firstTrayIcon extends JFrame{
	public firstTrayIcon () {
		SystemTray tray = SystemTray.getSystemTray();

		Image img = Toolkit.getDefaultToolkit().getImage("C:\\icon.png");

		PopupMenu popup = new PopupMenu();
		MenuItem mItem1 = new MenuItem("Exit");
		mItem1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				System.exit(0);
			}
		});
		popup.add(mItem1);

		TrayIcon trayIcon = new TrayIcon(img, "Tray Demo", popup);
		try {
			tray.add(trayIcon);
		} catch (AWTException e) {
			System.err.println("Problem loading Tray icon");
		}
		//3sec warten
		try { Thread.sleep(3000); } catch(Exception e) {};
		//dann Input Dialog aufrufen
		String pfad = JOptionPane.showInputDialog(this, "Input ");
		
		
	}


	public static void main(String[] args) {
		new firstTrayIcon ();
	}
}
```

Ganz am Schluss warte ich 3 sec. In diesen 3 Sec muss ein anderes Fenster aktiviert (in Vordergrund) werden, so ist es dann auch bei meiner Anwendung. Trotzdem soll der InputDialog dann im Vordergrund kommen.
Jemand eine Idee?

Ich habe das hier noch gefunden:

```
JOptionPane jop = new JOptionPane();
        jop.setMessage("Hallo");
        JDialog dialog = jop.createDialog(this, "Message");
        dialog.setAlwaysOnTop(true);
        dialog.setModal(true);
        dialog.setVisible(true);
```
So wie ich das sehe bringt man damit aber nur einen MessageDialog hin und nicht einen InputDialog, oder etwa doch?

Grüsse
jeipack


----------



## vfl_freak (8. Dezember 2010)

Moin,

dass muss so funktionieren, wie zuvor von mir beschrieben ....
Habe just zufällig heute morgen selbst einige solcher Stellen mit dem gleichen Problem dadurch bereinigt, dass hier statt "null" mit "this" aufgerufen habe!

Hier mal der Kommentar aus *JOptionPane.java* :

```
/**
     * Shows a question-message dialog requesting input from the user
     * parented to <code>parentComponent</code>.
     * The dialog is displayed on top of the <code>Component</code>'s
     * frame, and is usually positioned below the <code>Component</code>. 
     *
     * @param parentComponent  the parent <code>Component</code> for the
     *		dialog
     * @param message  the <code>Object</code> to display
     * @exception HeadlessException if
     *    <code>GraphicsEnvironment.isHeadless</code> returns
     *    <code>true</code>
     * @see java.awt.GraphicsEnvironment#isHeadless
     */
    public static String showInputDialog(Component parentComponent,
        Object message) throws HeadlessException { 
        return showInputDialog(parentComponent, message, UIManager.getString(
            "OptionPane.inputDialogTitle", parentComponent), QUESTION_MESSAGE);
    }
```

gruß
Klaus


----------



## MiMi (8. Dezember 2010)

Gibts ansonsten keine requestFocus methode?


----------



## jeipack (8. Dezember 2010)

Hi
Vielen Dank für eure Unterstützung. 


vfl_freak hat gesagt.:


> Moin,
> 
> dass muss so funktionieren, wie zuvor von mir beschrieben ....



Ich hab es sorum versucht, aber klappte leider nicht. Das Problem war, dass eine völlig andere Applikation im Vordergrund ist zu der Zeit in der dieser Dialog aufgerufen wird und das Programm aus dem der Dialog aufgerufen wird selbst kein Fenster besitzt.

Nun habe ich mir aber auch eben die Source von JOptionPane angeschaut und das ganze einfach so nachgebaut:

```
JOptionPane jop = new JOptionPane();
								jop.setWantsInput(true);
						        jop.setMessage("Input");
						        JDialog dialog = jop.createDialog(this, "title");
						        dialog.setAlwaysOnTop(true);
						        dialog.setVisible(true);
								
						        String pfad = jop.getInputValue()==JOptionPane.UNINITIALIZED_VALUE?null:(String) jop.getInputValue();
```
 
Das funktioniert nun soweit, dass der Dialog immer im Vordergrund erscheint. Einziges Problem ist noch, dass es nicht focusiert ist, sprich: es ist im Vordergrund und der Cursor blinkt, man aber nicht gleich losschreiben kann. 

```
dialog.requestFocus();
```
löst das Problem leider nicht


----------

