2009-08-19 3 views
2

Ich verwende ein Java Swing-basiertes Framework, das Popup-Nachrichten mit Java Swing-JDialogboxen anzeigt. Ich brauche eine Referenz, damit ich sie programmatisch schließe. Das Framework erstellt Dialogfelder, behält jedoch keinen Verweis auf sie. Kann ich einen Verweis auf die aktuell angezeigte Box erhalten?Wie bekomme ich einen Verweis auf die aktuell angezeigte Java Swing-JDialog-Box?

Danke.

+0

Können Sie klären, ob Sie finden möchten Referenz von ALLem Jdialog sichtbar oder nur der eine im Vordergrund? – jfpoilpret

+0

Checkout [ActiveWindowTracker] (http://www.jroller.com/santhosh/entry/find_current_last_active_window) von meinem Blog –

Antwort

0

Ich sehe keinen Weg zu wissen, was derzeit als Kind eines Rahmens geöffnet ist - ich sehe nur Methoden zum Abrufen der übergeordneten Frames.

Können Sie die aktuellen Klassen ändern, die die Dialogfelder aufrufen? Wenn dies der Fall ist, können Sie einen Container hinzufügen, um die Dinge beim Öffnen und Schließen zu verfolgen und einige Methoden für den Zugriff auf diesen Container hinzuzufügen.

0

Fenster w = KeyboardFocusManager.getCurrentKeyboardFocusManager(). GetFocusedWindow();

Sie können es dann zu JDialog überprüfen und umwandeln.

Aber wie ich in Ihrer vorherigen Frage gesagt habe - müssen Sie Ihren Ansatz ändern.

1

Sie können einen Verweis auf alle untergeordneten Fenster mit der getWindows() -Methode für die Window-Klasse abrufen.

Seien Sie vorsichtig, da ich vermute, dass eines der zurückgegebenen Fenster Ihr Rahmen/Fenster der obersten Ebene sein wird. Sie können Fensterattribute wie Titel prüfen, um festzustellen, welcher Dialog geschlossen werden soll.

Es gibt auch spezifischere Versionen: getOwnedWindows() und getOwnerlessWindows() je nach Ihren Bedürfnissen.

+0

Seit 1.6, BTW. Es ist viel besser, einen vernünftigen Rahmen zu verwenden, als dies zu versuchen. –

+0

Wenn Sie mit WebStart/PlugIn arbeiten, werden Sie möglicherweise in einigen Situationen auch einen Dummy-Dialog erhalten. –

+0

@Tom, ich stimme deinem Framework/Hack-Kommentar zu, aber ich vermute aufgrund der Antwort von Eugene, dass Dave bereits geraten wurde, das Framework schon einmal zu korrigieren. – Aaron

4

Versuchen Sie folgendes:

import java.awt.Window; 
import javax.swing.JDialog; 

public class Test { 
    public static void main(String[] args) { 
     JDialog d = new JDialog((Window)null,"Demo Dialog"); 
     for (Window w : JDialog.getWindows()) { 
      if (w instanceof JDialog) { 
       System.out.println(((JDialog)w).getTitle()); 
      } 
     } 
    } 
} 

Und wenn Sie sind verwirrt durch die:

(Window)null 

gegossen, einfach versuchen, ohne es zu kompilieren :)

(BTW ein Null-Fenster vorbei zu der Konstruktor erstellt einen nicht verwendeten Dialog)

EDIT: Bitte Beachten Sie, dass Sie auf alle Dialoge verweisen, unabhängig davon, ob sie sichtbar sind, wie der Code demonstriert. Um es zu beheben einfach den Dialog abfragen, ob es sich sichtbar von isVisible mit()

0

Wenn Sie die JDialog explizit anstatt JOptionPane.showXXX erstellen müssen Sie bereits einen Verweis auf den Dialog. Dies wäre definitiv mein bevorzugter Ansatz; z.B.

JDialog dlg = new JDialog(null, "My Dialog", false); // Create non-modal dialog. 
dlg.setLayout(new BorderLayout()); 
dlg.add(myPanel, BorderLayout.CENTER); 
dlg.pack(); 
dlg.setLocationRelativeTo(null); 
dlg.setVisible(true); 
+0

er möchte wahrscheinlich die Referenz an einem anderen/irrelevanten Teil des Codes. Dafür habe ich eine Antwort vorgeschlagen, die auf alle Dialoge verweist ... –

+0

@Sawas: Du hast wahrscheinlich Recht, aber um ehrlich zu sein, hört sich das nach schlechtem Design an. – Adamski

1

, wenn Sie einen Verweis auf die am weitesten vorne JDialog erhalten möchten, dann müssen Sie auf AWT Ereignisse hören und diese Referenz aktualisieren „leben“ und speichern Sie es irgendwo.

Hier ist, was ich in meinem eigenen Swing-Rahmen zu tun:

public class ActiveWindowHolder 
{ 
    public DefaultActiveWindowHolder() 
    { 
     _current = null; 
     Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() 
     { 
      public void eventDispatched(AWTEvent e) 
      { 
       DefaultActiveWindowHolder.this.eventDispatched(e); 
      } 
     }, AWTEvent.WINDOW_EVENT_MASK); 
    } 

    public Window getActiveWindow() 
    { 
     return _current; 
    } 

    private void eventDispatched(AWTEvent e) 
    { 
     switch (e.getID()) 
     { 
      case WindowEvent.WINDOW_ACTIVATED: 
      _current = ((WindowEvent) e).getWindow(); 
      break; 

      case WindowEvent.WINDOW_DEACTIVATED: 
      _current = null; 
      break; 

      default: 
      // Do nothing (we are only interested in activation events) 
      break; 
     } 
    } 

    private Window _current;  
} 

So stellen Sie sicher, dass Sie ActiveWindowHandler in Ihrem Haupt-Thread instanziiert, bevor sie eine Komponente darstellt; Von diesem Zeitpunkt an wird jeder Aufruf von ActiveWindowHandler.getActiveWindow() das vorderste Fenster zurückgeben (entweder JDialog von JFrame).

+0

Das ist einfach großartig. :-) Warum setzen Sie es auf 'null', wenn das' WINDOW_DEACTIVATED' Ereignis auftritt? – Kurtibert

+1

@Kurtibert Dies kann passieren, wenn das letzte Fenster geschlossen wird, daher gibt es kein aktives Fenster mehr. – jfpoilpret

0

entweder der Dialog als modal eingestellt, die Ihr Leben einfach macht ...
OR, wenn Sie Ihre JDialog sind initialisiert haben die folgenden:

JDialog d = new JDialog(); 
d.addWindowListener(new WindowAdapter(){ 
    public void windowClosed(WindowEvent e){ 
     dialogClosedAlertFunction(); //goes wherever you want it to go 
    } 
}); 
Verwandte Themen