2016-07-13 2 views
0

Мое приложение интегрировано с сторонним автономным приложением, которое откроет диалоговые окна JOptionPane в отдельном потоке, и я запускаю поток, чтобы закрыть все открытые диалоговые окна. Поэтому перед закрытием мне нужно получить сообщение, записанное в диалоговом окне.Как получить программный контент сообщения JOptionPane

Мой образец основной программы, с которой я пытаюсь достичь:

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

вы уверены, что все ссылки в массиве possibleWindow будут экземплярами JOptionPane? Если да, то имеет ли смысл в вашем приложении использовать Extend (путем прямого расширения или инкапсуляции) JOptionPane для создания нового класса, который регистрировал бы содержимое панели при ее создании? Таким образом, вы не будете пытаться проиграть в конце. – Teto

+1

Я только что проверил, JOptionPane не является подклассом Window. Поэтому я не вижу, как он может появиться в массиве возможного окна. Но если вы можете получить ссылку на существующий JOptionPane другим методом, вы можете просто вызвать JOptionPane.getMessage(), чтобы получить объект сообщения. – Teto

+0

Мое приложение интегрировано с сторонним независимым приложением качания, и я не создавал объекты JOptionPane для отображения диалоговых окон сообщений. –

ответ

1

Если я получаю свой вопрос правильно, вы клеть объекты JOptionPane и дать им сообщение; и позже, вы хотите знать сообщение, которое вы им дали?

Если это так, простым решением было бы создать центральную карту, например Map<JOptionPane, String>. Каждый раз, когда вы создаете новую JOptionPane, вы помните ее (и ее сообщение); и при очистке; вы просто извлекаете сообщения для тех объектов JOptionPane, которые все еще находятся.

+0

Мое приложение интегрировано с сторонним независимым приложением качания, и я не создавал объекты JOptionPane для отображения диалоговых окон сообщений. –

0

Вам нужно рекурсивно все компоненты окна. Это решение будет работать в вашем случае:

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

Я попробовал решение, не работал для меня. Я пробовал использовать мою основную программу. –

0

Это решение работает для меня:

if (window instanceof JDialog) { 
     System.out.println("text : " + ((JOptionPane)((JDialog) window).getContentPane().getComponents()[0]).getMessage()); 
    } 
Смежные вопросы