Janelas JAVA [Resolvido]

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?

Uso o NetBeans.

Agradeço desde já.

@EduFeitosa provavelmente você esta dando dispose() na janela principal desse botao, mas posta o codigo dessa janela principal

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.

1 curtida

private void jMenu3MouseClicked(java.awt.event.MouseEvent evt) {
System.exit(0);
}

private void jMenu1MouseClicked(java.awt.event.MouseEvent evt) {                                    
    Criptografar oCriptografar = new Criptografar ();
		oCriptografar .setVisible(true);
		dispose();
}                                   

private void jMenu2MouseClicked(java.awt.event.MouseEvent evt) {                                    
    Descriptografar oDescriptografar = new Descriptografar ();
		oDescriptografar .setVisible(true);
		dispose();

}

Esses estão dentro do Menu principal. O que eu gostaria… Deixar o Menu principal aberto enquanto eu chamo as outas duas janelas.

Remova os comandos dispose();

Isso vai resolver este problema!

@Jonathan_Medeiros Funcionou cara, a principal se mantem aberta… porém as janelas estão abrindo por trás da principal.

Tenta executar esse comandos apos chamar as janelas

oCriptografar.toFront();
oCriptografar.requestFocus();

@jacoboliveira

Se for assim não resultou. : =(

private void jMenu1MouseClicked(java.awt.event.MouseEvent evt) {                                    
        Criptografar oCriptografar = new Criptografar ();
			oCriptografar .setVisible(true);
			oCriptografar.toFront();
            oCriptografar.requestFocus();

Esse site aqui mostra algumas maneiras:

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 
*/
public class ModalFrameUtil {
 
    static class EventPump implements InvocationHandler {
 
        Frame frame;
 
        public EventPump(Frame frame) {
            this.frame = frame;
        }
 
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            return frame.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.
        public void start() throws Exception {
            Class clazz = Class.forName("java.awt.Conditional");
            Object conditional = Proxy.newProxyInstance(
                    clazz.getClassLoader(),
                    new Class[]{clazz},
                    this);
            Method pumpMethod = Class.forName("java.awt.EventDispatchThread")
                    .getDeclaredMethod("pumpEvents", new Class[]{clazz});
            pumpMethod.setAccessible(true);
            pumpMethod.invoke(Thread.currentThread(), new Object[]{conditional});
        }
    }
 
    // show the given frame as modal to the specified owner.
    // NOTE: this method returns only after the modal frame is closed.
    public static void showAsModal(final Frame frame, final Frame owner) {
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowOpened(WindowEvent e) {
                owner.setEnabled(false);
            }
 
            @Override
            public void windowClosed(WindowEvent e) {
                owner.setEnabled(true);
                frame.removeWindowListener(this);
                owner.toFront();
            }
        });
 
        owner.addWindowListener(new WindowAdapter() {
            @Override
            public void windowActivated(WindowEvent e) {
                if (frame.isShowing()) {
                    frame.setExtendedState(JFrame.NORMAL);
                    frame.toFront();
                } else {
                    owner.setEnabled(true);
                    owner.removeWindowListener(this);
                   
                }
 
            }
        });
 
        frame.setVisible(true);
        try {
            new EventPump(frame).start();
        } catch (Throwable throwable) {
            throw new RuntimeException(throwable);
        }
    }      
    
    public static void showAsModalDialog(final Frame frame, final JDialog owner) {
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowOpened(WindowEvent e) {
                owner.setModal(false);
                owner.setEnabled(false);
            }
 
            @Override
            public void windowClosed(WindowEvent e) {
                owner.setEnabled(true);
                owner.setModal(true);
                frame.removeWindowListener(this);
                owner.toFront();
            }
        });
        
 
        owner.addWindowListener(new WindowAdapter() {
            @Override
            public void windowActivated(WindowEvent e) {
                if (frame.isShowing()) {
                    frame.setExtendedState(JFrame.NORMAL);
                    frame.toFront(); 
                } else {
                    owner.setEnabled(true);
                    owner.setModal(true);
                    owner.removeWindowListener(this);
                   
                }
 
            }
        });
 
        frame.setVisible(true);
        try {
            new EventPump(frame).start();
        } catch (Throwable throwable) {
            throw new RuntimeException(throwable);
        }
    }
}

Para utilizar a classe basta fazer da seguinte forma:

Criptografar oCriptografar = new Criptografar();
ModalFrameUtil.showAsModal(oCriptografar, this);

Eita, agora to um tanto confuso hehe

Mas vou tentar entender.

Ao fazer a chamada da tela ele ta fechando a principal
so retire o dipose();

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.

Valeeeeuuu Obrigadão. =)