Usar JFrame como um JOptionPane

Bom pessoal, estou desenvolvendo uma aplicação para uma loja que, por sua vez possui vários cadastros (usuários, clientes, etc…).

Eu gostaria de perguntar ao usuário se ele deseja realmente sair antes de fechar ou não o cadastro.

Eu já sei que preciso setar o DO_NOTHING como defaultCloseOperation e programar o JOptionPane no evento WindowClosing do formulário.

PORÉM eu acho o JOptionPane muito feio e pouco personalizável, então criei um Jframe “bonitinho” que possui dois botões: um SIM (que confirma o fechamento) e outro NÃO (que não faz nada).

Ele funciona da seguinte forma:
Quando o fecho ele simplesmente fecha;
Quando clico em NÃO ele também se fecha;
E quando clico em SIM ele deveria se fechar E FECHAR O FORMULÁRIO.

SÓ QUE ELE SIMPLISMEMTE NÃO FECHA O FORMULÁRIO!!!
Ele só está se fechando (o que era pra acontecer depois que fechasse o formulário)!

O código do botão SIM está programado da seguinte forma:
{
JframeForm Form = new JframeForm();
Form.dispose();

dispose();
}
ALGUÉM ME AJUDE POR FAVOR!!!
SINCERAMENTE NÃO SEI O QUE PODE SER :confused:

Seu frame principal deve possuir um listner que recebe a resposta do seu outro frame ao ser acionado o click dos botões SIM ou NÃO, com base nisso, você executa a ação, pois o código que você fez apenas executa o dispose 2 vezes no mesmo frame.

1 curtida

CARAMBA, VALEU MESMO CARA!
Eu não imaginava que era tão rápido kkkkkkkk

Mas você pode me dizer como eu faço isso? Sou BEM iniciante ainda em Java

Seria algo mais ou menos dessa forma!

No seu frame principal ficaria o código abaixo:

FramePersonalizado frame = new FramePersonalizado(this, true);//Neste exemplo utilizei uma JDialog   
frame.setVisible(true);
frame.addWindowListener(new java.awt.event.WindowAdapter() {
    @Override
    public void windowClosed(java.awt.event.WindowEvent evt) {
        //Aqui você pega o retorno do framePersonalizado
        //Se o retorno for verdadeiro aplica o dispose, caso contrário não executa nenhuma ação
    }
});
1 curtida

Muito obrigado cara!
Vou tentar

Para não ficar feio, sempre utilizo o look and feel do sistema operacional.
Nos casos de só ter uma opção de Sim ou Não, utilizo o JOptionPane com os parâmetros adequados:

import java.awt.Dimension;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.UIManager;

public class Exemplo extends JFrame {

    public static void main(String[] args) throws Exception {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        Exemplo telinha = new Exemplo();
        telinha.setVisible(true);
    }

    public Exemplo() {
        super("Minha Telinha");
        setMinimumSize(new Dimension(640, 480));
        setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                sair();
            }
        });
    }

    private void sair() {
        if (confirma("Deseja realmente sair?")) {
            System.exit(0);
        }
    }

    private boolean confirma(String message) {
        String title = "Confirmação";
        int optionType = JOptionPane.YES_NO_OPTION;
        int messageType = JOptionPane.QUESTION_MESSAGE;
        int option = JOptionPane.showConfirmDialog(this, message, title, optionType, messageType);
        return option == JOptionPane.YES_OPTION;
    }
}
1 curtida