Я не уверен, что вы спрашиваете о «сборке мусора» или о том, как идентифицировать видимые диалоговые окна.
Вы не можете контролировать, когда сборка мусора завершена. Вызов метода gc () - только предложение.
Если вы хотите игнорировать «удаленные» диалоги, вы можете использовать метод isDisplayable () для проверки его статуса.
С помощью следующей программы я получил интересные результаты. Первым изменением, которое я сделал, было добавление некоторых компонентов в диалог, чтобы больше ресурсов использовалось для каждого диалога, что увеличило бы вероятность того, что ресурсы будут собираться мусором.
На моей машине я обнаружил, что если я
а) создать 5 диалогов
б) закрыть диалоги
в) создать 5 диалогов
Тогда первые 5 выглядят как мусор.
Однако, если я создаю 5, затем закрываю, затем создаю 1, затем закрываю, похоже, это не сработает.
Суть в том, что вы не можете зависеть от того, когда будет выполняться сборка мусора, поэтому я предлагаю вам использовать метод isDisplayable (), чтобы определить, как выполнять вашу обработку. Кнопка «Показать диалоги» использует этот метод как часть отображаемого вывода.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class DialogSSCCE extends JPanel
{
public static int count;
public DialogSSCCE()
{
JButton display = new JButton("Display Dialogs");
display.addActionListener( new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.out.println();
System.out.println("Display Dialogs");
for (Window window: Window.getWindows())
{
if (window instanceof JDialog)
{
JDialog dialog = (JDialog)window;
System.out.println("\t" + dialog.getTitle() + " " + dialog.isDisplayable());
}
}
}
});
add( display );
JButton open = new JButton("Create Dialog");
open.addActionListener( new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.out.println();
System.out.println("Create Dialog");
JDialog dialog = new JDialog();
dialog.getContentPane().setLayout(null);
for (int i = 0; i < 200; i++)
{
dialog.add( new JTextField("some text") );
}
dialog.setTitle("Dialog " + count++);
dialog.setLocation(count * 25, count * 25);
dialog.setVisible(true);
System.out.println("\tCreated " + dialog.getTitle());
}
});
add( open );
JButton close = new JButton("Close Dialogs");
close.addActionListener( new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.out.println();
System.out.println("Close Dialogs");
for (Window window: Window.getWindows())
{
if (window instanceof JDialog)
{
JDialog dialog = (JDialog)window;
System.out.println("\tClosing " + dialog.getTitle());
dialog.dispose();
}
}
Runtime.getRuntime().gc();
}
});
add( close );
}
private static void createAndShowUI()
{
JFrame frame = new JFrame("DialogSSCCE");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add( new DialogSSCCE() );
frame.pack();
frame.setLocationRelativeTo( null );
frame.setVisible( true );
}
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowUI();
}
});
}
}