Olá pessoal, estou tentando fazer um programinha. Ele tem 3 JFrames, 1 Principal e outras duas. A principal tem botões que chamam as outras duas, porém ao clicar para chamar, a principal fecha, mas quero que fique aberta. Tem algo a ver com dispose(), .setVisible ou outra coisa?
@EduFeitosa provavelmente você esta dando dispose() na janela principal desse botao, mas posta o codigo dessa janela principal
P
paulonoforum1 like
Geralmente se usa JFrame para as janelas principais e um JDialog para as secundarias.
Agora se quiser usar somente com JFrame mesmo, um setVisitle(false) apenas oculta a janela sem fechá-la.
Mas seria legal você postar seu código para podermos entender melhor o quê você pretente.
Tenho uma classe que provavelmente irá resolver o problema de abertura do frame por trás da principal!
Ela faz com que o frame que for aberto receba o foco enquanto estiver aberto, e quando for fechado ele devolve o foco para o frame de origem, funciona tanto para JFrame como também para JDialog.
/** @author jhenrique */publicclassModalFrameUtil{staticclassEventPumpimplementsInvocationHandler{Frameframe;publicEventPump(Frameframe){this.frame=frame;}@OverridepublicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{returnframe.isShowing()?Boolean.TRUE:Boolean.FALSE;}// when the reflection calls in this method has to be// replaced once Sun provides a public API to pump events.publicvoidstart()throwsException{Classclazz=Class.forName("java.awt.Conditional");Objectconditional=Proxy.newProxyInstance(clazz.getClassLoader(),newClass[]{clazz},this);MethodpumpMethod=Class.forName("java.awt.EventDispatchThread").getDeclaredMethod("pumpEvents",newClass[]{clazz});pumpMethod.setAccessible(true);pumpMethod.invoke(Thread.currentThread(),newObject[]{conditional});}}// show the given frame as modal to the specified owner.// NOTE: this method returns only after the modal frame is closed.publicstaticvoidshowAsModal(finalFrameframe,finalFrameowner){frame.addWindowListener(newWindowAdapter(){@OverridepublicvoidwindowOpened(WindowEvente){owner.setEnabled(false);}@OverridepublicvoidwindowClosed(WindowEvente){owner.setEnabled(true);frame.removeWindowListener(this);owner.toFront();}});owner.addWindowListener(newWindowAdapter(){@OverridepublicvoidwindowActivated(WindowEvente){if(frame.isShowing()){frame.setExtendedState(JFrame.NORMAL);frame.toFront();}else{owner.setEnabled(true);owner.removeWindowListener(this);}}});frame.setVisible(true);try{newEventPump(frame).start();}catch(Throwablethrowable){thrownewRuntimeException(throwable);}}publicstaticvoidshowAsModalDialog(finalFrameframe,finalJDialogowner){frame.addWindowListener(newWindowAdapter(){@OverridepublicvoidwindowOpened(WindowEvente){owner.setModal(false);owner.setEnabled(false);}@OverridepublicvoidwindowClosed(WindowEvente){owner.setEnabled(true);owner.setModal(true);frame.removeWindowListener(this);owner.toFront();}});owner.addWindowListener(newWindowAdapter(){@OverridepublicvoidwindowActivated(WindowEvente){if(frame.isShowing()){frame.setExtendedState(JFrame.NORMAL);frame.toFront();}else{owner.setEnabled(true);owner.setModal(true);owner.removeWindowListener(this);}}});frame.setVisible(true);try{newEventPump(frame).start();}catch(Throwablethrowable){thrownewRuntimeException(throwable);}}}
Para utilizar a classe basta fazer da seguinte forma:
Ao fazer a chamada da tela ele ta fechando a principal
so retire o dipose();
E
EduFeitosa
Obrigado gente, depois da ajuda de vocês e me matar um pouco… Consegui fazer a janela principal não fechar e as secundárias ficarem na frente na hora da chamada.