Получить любые/все активные JFrames в приложении Java?

Есть ли способ из приложения Java, чтобы отобразить все текущие открытые/активные (я не уверен здесь в терминологии) JFrames, которые видны на экране? Благодарим за помощь.

Ответы

Ответ 1

Frame.getFrames() возвращает массив всех фреймов.

В качестве альтернативы, как упоминалось в @mKorbel, Window.getWindows() вернет все окна - поскольку Frame (& JFrame) продолжит Window, который предоставит все кадры, а затем некоторые. Необходимо будет повторить их, чтобы узнать, какие из них в настоящее время видны.

Ответ 2

Я согласен с комментарием Стефана Рейха.

Очень полезным методом является Window.getOwnedWindows()... и один контекст, где полезно, если не важно, TDD (Test-Driven Development): в тесте (интеграция), где у вас есть различные объекты Window (JDialog и т.д.), если что-то пойдет не так, прежде чем тест завершится нормально (или даже если он закончится нормально), вы часто захотите избавиться от подчиненных окон в коде очистки. Что-то вроде этого (в JUnit):

@After
public void executedAfterEach() throws Exception {
    // dispose of dependent Windows...
    EventQueue.invokeAndWait( new Runnable(){
        @Override
        public void run() {
            if( app.mainFrame != null ){
                for( Window window : app.mainFrame.getOwnedWindows() ){
                    if( window.isVisible() ){
                        System.out.println( String.format( "# disposing of %s", window.getClass() ));
                        window.dispose();
                    }
                }
            }
        }
    });
}

Ответ 3

Frame.getFrames() выполнит вашу работу.

От oracle Doc:

Возвращает массив всех фреймов, созданных этим приложением. Если вызвано из апплета массив включает только Frames, доступные для этого апплет.

Простой пример:

//all frames to a array
Frame[] allFrames = Frame.getFrames();

//Iterate through the allFrames array
for(Frame fr : allFrames){
    //uncomment the below line to see frames names and properties/atr.
    //System.out.println(fr);        

    //to get specific frame name
    String specificFrameName = fr.getClass().getName();

    //if found frame that I want I can close or any you want
    //GUIS.CheckForCustomer is my specific frame name that I want to close.
    if(specificFrameName.equals("GUIS.CheckForCustomer")){
        //close the frame
        fr.dispose();
    }
}

Также вы можете использовать Window.getWindows(), как упоминалось ранее.