2012-04-11 5 views
7

Meine Anwendung bietet die Möglichkeit, eine lang andauernde Aufgabe zu starten. Wenn das auftritt, wird ein nicht modales JDialog gestartet, das den Fortschritt der Aufgabe anzeigt. Ich mache den Dialog speziell modeless, damit der Benutzer während der Ausführung der Aufgabe mit dem Rest der GUI interagieren kann.Der modeless JDialog muss über dem übergeordneten Element sichtbar sein

Das Problem, mit dem ich konfrontiert bin, ist, dass, wenn der Dialog hinter anderen Fenstern auf dem Desktop versteckt wird es schwierig zu finden ist: Es gibt kein entsprechendes Element in der Taskleiste (unter Windows 7), noch ist ein Symbol sichtbar unter dem Alt + Tab-Menü.

Gibt es einen idiomatischen Weg, um dieses Problem zu lösen? Ich hatte überlegt, WindowListener zu JFrame der Anwendung hinzuzufügen und diesen zu verwenden, um den JDialog in den Vordergrund zu bringen. Dies wird jedoch wahrscheinlich frustrierend (da dies vermutlich bedeutet, dass der JFrame dann den Fokus verliert).

+0

Warum Sie eine JFrame nicht stattdessen verwenden? Das ist einer der Hauptunterschiede: der Knopf in der Taskleiste. –

+0

Weil ich nicht möchte, dass der Dialog die Funktionalität maximiert oder minimiert. – Adamski

+0

Sie können setResizable (false); Ich würde zulassen, zu minimieren, sonst könnte die Anwendung ein wenig beleidigend sein, IMO. –

Antwort

8

Sie können einen nicht-modalen Dialog erstellen und ihm einen übergeordneten Frame/Dialog zuweisen. Wenn Sie den übergeordneten Frame/Dialog aufrufen, wird auch der nicht-modale Dialog angezeigt.

So etwas wie dies verdeutlicht dies:

public static void main(String[] args) throws IOException { 
    JFrame frame = new JFrame(); 
    frame.setTitle("frame"); 
    JDialog dialog = new JDialog(frame, false); 
    dialog.setTitle("dialog"); 
    final JButton button = new JButton("Click me"); 
    button.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      JOptionPane.showMessageDialog(button, "Hello"); 
     } 
    }); 
    final JButton button2 = new JButton("Click me too"); 
    button2.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      JOptionPane.showMessageDialog(button2, "Hello dialog"); 
     } 
    }); 
    frame.add(button); 
    dialog.add(button2); 
    frame.pack(); 
    dialog.pack(); 
    frame.setVisible(true); 
    dialog.setVisible(true); 
} 
+0

Danke - das hat Spaß gemacht. Sieht so aus, als ob ich die Position des Dialogs relativ zu einer übergeordneten Komponente eingestellt habe, aber nicht den JDialog mit einem Eigentümer konstruiere. – Adamski