zamykanie okna z potwierdzeniem

0

chce by po kliknieciu w X okna pojawil sie messagebox z pytaniem czy zamknac okno, w przypadku klikniecia nie - okna ma sie nie zamykac, tymczasem u mnie obojetnie czy klikne tak czy nie to i tak okno sie zamyka - dlaczego ?

package zamkniecieoknazpotwierdzeniem;
import javax.swing.*; 
import java.awt.*;

public class Main
{

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                Ramka a = new Ramka(); 
                a.setSize(400, 400);
                
                a.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                a.setVisible(true); 
            }
        });

    }

}
package zamkniecieoknazpotwierdzeniem;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;


public class Ramka extends JFrame
{

    Ramka()
    {


        WindowListener sluchacz = new Zamykanie();
        this.addWindowListener(sluchacz);

    }

    class Zamykanie extends WindowAdapter
    {
        public void windowClosing(WindowEvent e)
        {
            int answer = JOptionPane.showConfirmDialog(null, "Zamknąć program ?", "Tytuł", JOptionPane.YES_NO_OPTION);

           if (answer == JOptionPane.YES_OPTION)
           {
                 System.exit(0);
           }
           
        }
    }
}

0

Ze względu na ten wiersz:

a.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Zamien go na

a.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
0

Dzięki :)

0

Dodam tylko, że gdyby Twój program otwierałby kilka okien najwyższego poziomu i gdybyś chciał zamykać tylko to jedno konkretne, którego zamknięcie zostało wywołane, to trzeba by użyć zamiast System.exit(0);
((Window)(e.getSource())).dispose();
Konwertujesz tym referencję będącą źródłem komunikatu (musi być ono w Swingu klasą pochodną od być może JFrame, być może Frame, ale na pewno Window) na referencję do okna i wywołujesz polecenie jego zamknięcia.
Można też przed zamknięciem sprawdzić czy jest to ostatnie otwarte okno i dopiero wtedy zamykać całą aplikację, a nie tylko samo okno (o ile ta nie miałaby działać w tle).

0

Ja w powyzszej sytuacji znacznie częściej używam

((Window)(e.getSource())).setVisible(false);
. Zamykane właśnie okno będzie zapewne jeszcze potrzebne (wraz z danymi wprowadzonymi przez użytkownika).

0

Ano racja.

1 użytkowników online, w tym zalogowanych: 0, gości: 1