2014-10-31 4 views
0

Я пытаюсь найти метод, который может закрыть активный JFrame.Как закрыть активный JFrame

Я не могу использовать frame.dispose();, так как я объявляю прослушиватель действий в классе панели инструментов, и кадры, которые я хочу закрыть, не являются статическими и объявляются во время выполнения.

Я попытался с помощью:

java.awt.Window win[] = java.awt.Window.getWindows(); 
for(int i=0;i<win.length;i++){ 
win[i].dispose(); 
} 

и в то время как это работа, при определенных обстоятельствах оно будет закрыто более чем одно окно, даже если только 1 окно, как представляется, быть открытым, поэтому кадры будут мигать открытые и закрытые многие в зависимости от того, какие действия сделал пользователь.

Для меня, чтобы полностью воссоздать мою проблему, было бы размещение значительного количества кода, который не соответствовал бы принципам MCVE.

Я надеюсь, что кто-то узнает более простой и надежный способ закрытия активной рамки в форме acitveframe.dispose(); - что я сейчас не являюсь реальным решением!

+1

* Я объявляю прослушиватель действий в классе панели инструментов, и кадры, которые я хочу закрыть, не являются статическими и объявляются во время выполнения. * См. [Использование нескольких JFrames, Good/Bad Practice?] (Http: // stackoverflow.com/a/9554657/1795530). – dic19

ответ

2

Что произойдет, если вы попытаетесь получить предка Window источника события события? т.е.

@Override 
public void actionPerformed(ActionEvent actionEvent) { 
    Component comp = (Component) actionEvent.getSource(); 
    Window win = SwingUtilities.getWindowAncestor(comp); 
    win.dispose(); 
} 

Это не будет работать, если источник не является компонентом, или если оно не содержится в пределах окна верхнего уровня, представляющего интерес.


Относительно:

Для меня, чтобы полностью воссоздать мою проблему предполагает размещение значительное количество кода, который не был бы в соответствии с принципами MCVE.

Я готов поспорить с небольшим усилием, которое вы могли бы создать и опубликовать то, что приближается.

0

Когда вы объявляете JFrames, declre их окончательного, если вы не можете использовать статическую:

final JFrame f = new JFrame(); 

Было бы решить эту проблему.

1

Я надеюсь, кто-то будет знать о более простой и надежный способ закрытия активного кадра

В вашем цикле вы можете добавить:

if (window.isActive()) 
    // do something 

Или, может быть, более простой подход :

Window window = KeyboardFocusManager.getCurrentKeyboardFocusManager().getActiveWindow(); 

Кроме того, если ваше активное окно является JFrame, вместо u петь window.dispose(), я использовал код, как:

WindowEvent windowClosing = new WindowEvent(frame, WindowEvent.WINDOW_CLOSING); 
frame.dispatchEvent(windowClosing); 

это будет имитировать щелчок пользователя на кнопке «Закрыть», что означает, что любой WindowListener вы добавили к раме также будет выполнен.См. Closing an Appplication для получения дополнительной информации и идей.

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