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?
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
*/
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);
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.