2014-10-29 3 views
1

См. Пример кода ниже. Несколько раз нажав кнопку примера, как открыть последний диалог? Это реальный случай использования. Пользователь открыл один или два модальных диалоговых окна и нажал кнопку, запускающую длительную фоновую задачу в последнем диалоговом окне, и затем переключился на другое приложение во время выполнения этой фоновой задачи. По завершении задача должна отображать окно уведомлений с правильным диалоговым окном в качестве родителя, чтобы при возврате к приложению это окно уведомления отображалось поверх правильного диалога.Как найти текущий диалог?

import java.awt.FlowLayout; 
import java.awt.Window; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JDialog; 
import javax.swing.SwingUtilities; 
import javax.swing.WindowConstants; 

public class Example 
{ 

    private JDialog createDialog(final Window parent, final int count) 
    { 
     final JDialog dialog = new JDialog(parent, "Dialog " + count); 
     dialog.setModal(true); 
     dialog.getContentPane().setLayout(new FlowLayout()); 

     final JButton button = new JButton("Open Dialog " + (count + 1)); 
     button.addActionListener(new ActionListener() 
     { 

      @Override 
      public void actionPerformed(final ActionEvent e) 
      { 
       final JDialog nextDialog = createDialog(dialog, count + 1); 
       nextDialog.pack(); 
       nextDialog.setLocationRelativeTo(dialog); 
       nextDialog.setVisible(true); 
      } 

     }); 

     dialog.getContentPane().add(button); 
     return dialog; 
    } 

    public static void main(final String[] arguments) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 

      @Override 
      public void run() 
      { 
       final Example example = new Example(); 
       final JDialog dialog = example.createDialog(null, 1); 
       dialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); 
       dialog.pack(); 
       dialog.setLocationRelativeTo(null); 
       dialog.setVisible(true); 
      } 

     }); 
    } 

} 

ответ

2

Вы можете использовать KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusedWindow(), который, очевидно, возвращает окно, в котором ток содержит компонент с текущим фокусом клавиатуры ...

+0

Не совсем то, что я ищу. Окно может отображаться без фокуса. Вопрос не в том, чтобы найти окно текущего владельца фокуса. Это действительно о том, чтобы найти предварительный модальный диалог некоторого кадра - независимо от того, имеет ли этот фрейм фокус или нет. После завершения задачи, работающей в фоновом режиме, появляется окно с уведомлением. Во время работы пользователь может переключиться на другое приложение, не сводя к минимуму фрейм и т. Д. –

+0

Получите дочерние окна сфокусированного окна ... вопрос тогда в каком окне вы бы выбрали? – MadProgrammer

+0

См. Обновленный примерный код. –

Смежные вопросы