2016-07-13 5 views
0

Mon application est intégrée à une application autonome tierce qui ouvrira les boîtes de dialogue JOptionPane dans un thread séparé et j'exécuterai le thread pour fermer toutes les boîtes de dialogue ouvertes. Donc avant la fermeture, j'ai besoin de message écrit sur la boîte de dialogue.Comment obtenir par programme le contenu du message JOptionPane

Mon exemple de programme principal avec lequel je suis en train de réaliser:

public static void main(String[] args)throws Exception{ 
    ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1); 
    executor.scheduleAtFixedRate(() -> { 
     Window[] possibleWindow = Window.getWindows(); 
     if (possibleWindow != null && possibleWindow.length > 0) { 
      System.out.println("Found " + possibleWindow.length + "Window(s) " + possibleWindow[0].getClass().getSuperclass()); 
      for (int i = possibleWindow.length - 1; i >= 0; i--) { 
       try { 
        Window window = possibleWindow[i]; 
        //here where I need to get the dialog box message before closing it. 
        window.dispose(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    }, 1, 1, TimeUnit.SECONDS); 

    JOptionPane.showMessageDialog(null, "test !!!!"); 
} 
+0

êtes-vous certain que toutes les références dans le tableau possibleWindow seront des instances de JOptionPane? Si oui, cela aurait-il plus de sens dans votre application d'étendre (par extension directe ou encapsulation) JOptionPane pour créer une nouvelle classe qui enregistrerait le contenu du volet lors de sa création? De cette façon, vous n'essaieriez pas de nettoyer à la fin. – Teto

+1

Je viens de vérifier, JOptionPane n'est pas une sous-classe de Windows. Donc, je ne vois pas comment cela peut apparaître dans le tableau de fenêtre possible. Mais si vous pouvez obtenir une référence à un JOptionPane existant par une autre méthode, alors vous pouvez simplement appeler JOptionPane.getMessage() pour obtenir l'objet du message. – Teto

+0

Mon application est intégrée à une application autonome de balançoire tierce et je ne crée pas d'objets JOptionPane pour afficher des boîtes de dialogue de message. –

Répondre

1

Si je reçois vos objets de question JOptionPane correctement, vous caisse et leur donner un message; et plus tard, vous voulez connaître le message que vous leur avez donné?

Si oui, une solution simple serait de créer une carte centrale, comme Map<JOptionPane, String>. Chaque fois que vous créez un nouveau JOptionPane, vous vous en souvenez (et son message); et lors du nettoyage; vous récupérez simplement les messages pour les objets JOptionPane qui sont encore en place.

+0

Mon application est intégrée à une application autonome de swing tierce et je ne créais pas d'objets JOptionPane pour afficher des boîtes de dialogue –

0

Vous avez besoin de récursivement tous les composants de la fenêtre. Cette solution fonctionnera dans votre cas:

public static String getMess(Container w){    
    for (Component component : w.getComponents()) { 
     if (component instanceof JLabel) { 
      return ((JLabel) component).getText(); 
     } 
     else if (component instanceof JTextField){ 
      return ((JTextField) component).getText(); 
     } 
     else if (component instanceof Container){ 
      String s = getMess((Container) component); 
      if (!s.isEmpty()){ 
       return s; 
      } 
     } 
    } 
    return ""; 
} 
+0

J'ai essayé votre solution, n'a pas fonctionné pour moi. J'avais essayé avec mon programme principal de méthode d'échantillon. –

0

Cette solution a fonctionné pour moi:

if (window instanceof JDialog) { 
     System.out.println("text : " + ((JOptionPane)((JDialog) window).getContentPane().getComponents()[0]).getMessage()); 
    }