it-swarm-id.com

JFrame Keluar di Jawa dekat

Saya tidak mengerti bagaimana saya bisa menggunakan kode ini:

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

untuk menutup program dengan tombol x.

47
user983246

Anda membutuhkan garis

frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

Karena perilaku default untuk JFrame ketika Anda menekan tombol X adalah setara dengan

frame.setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);

Jadi hampir setiap saat Anda harus menambahkan baris itu secara manual saat membuat JFrame Anda

Saat ini saya mengacu pada konstanta dalam WindowConstants seperti WindowConstants.EXIT_ON_CLOSE alih-alih konstanta yang sama yang dinyatakan secara langsung dalam JFrame karena sebelumnya mencerminkan lebih baik maksudnya.

73
Jaime Hablutzel

Jika Anda tidak memilikinya, JFrame hanya akan dibuang. Frame akan ditutup, tetapi aplikasi akan terus berjalan.

7
Jeff Storey

Memanggil setDefaultCloseOperation(EXIT_ON_CLOSE) tidak persis seperti ini. Itu menyebabkan aplikasi untuk keluar ketika aplikasi menerima acara window dekat dari sistem operasi. Menekan tombol tutup (X) di jendela Anda menyebabkan sistem operasi membuat acara tutup jendela dan mengirimkannya ke aplikasi Java Anda. Acara jendela dekat diproses oleh loop acara AWT di aplikasi Java Anda yang akan keluar dari aplikasi sebagai respons terhadap acara tersebut.

Jika Anda tidak memanggil metode ini, loop acara AWT mungkin tidak keluar dari aplikasi sebagai respons atas acara tutup jendela tetapi biarkan tetap berjalan di latar belakang .

4
Brian Coleman

Saya menghabiskan cukup banyak waktu spelunking melalui internet untuk solusi elegan untuk ini. Seperti biasanya, saya menemukan banyak informasi yang saling bertentangan.

Saya akhirnya berakhir dengan:

  1. Jangan gunakan EXIT_ON_CLOSE karena ini dapat meninggalkan sumber daya;
  2. Gunakan sesuatu seperti yang berikut ini di inisialisasi JFrame:

    setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    
  3. Penemuan sebenarnya adalah bagaimana sebenarnya mengirim pesan jendela ke JFrame. Sebagai contoh, sebagai bagian dari JMenuItem Anda untuk keluar dari aplikasi, gunakan yang berikut, di mana fungsi getFrame() mengembalikan referensi ke JFrame:

    public class AppMenuFileExit extends JMenuItem implements ActionListener
    {
        // do your normal menu item code here
    
          @Override
          public void actionPerformed(ActionEvent e)
          {
            WindowEvent we;
            we = new WindowEvent((Window) App.getFrame(), WindowEvent.WINDOW_CLOSING);
    
            App.getFrame().dispatchEvent(we);
          }
    }
    

    JFrame adalah subclass dari Window sehingga dapat dilemparkan ke Window untuk tujuan ini.

  4. Dan, miliki yang berikut di kelas JFrame Anda untuk menangani pesan Window:

    public class AppFrame extends JFrame implements WindowListener
    {
      // Do all the things you need to for the class
    
      @Override
      public void windowOpened(WindowEvent e)
      {}
      @Override
      public void windowClosing(WindowEvent e)
      {/* can do cleanup here if necessary */}
    
      @Override
      public void windowClosed(WindowEvent e)
      {
        dispose();
        System.exit(0);
      }
      @Override
      public void windowActivated(WindowEvent e)
      {}
      @Override
      public void windowDeactivated(WindowEvent e)
      {}    
      @Override
      public void windowDeiconified(WindowEvent e)
      {}
      @Override
      public void windowIconified(WindowEvent e)
      {}
    }
    
2
Higgs

Jika Anda menggunakan Frame (Kelas Memperluas Frame) Anda tidak akan mendapatkan 

frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE)
1
Yacine

this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

ini bekerja untuk saya dalam kasus Kelas Memperluas Bingkai

0
Aditya Joshi

Jika Anda tidak memperluas JFrame dan menggunakan JFrame sendiri dalam variabel, Anda dapat menggunakan:

frame.dispose();
System.exit(0);
0
Dmitriy Potapov

Kode berikut ini berfungsi untuk saya:

System.exit(home.EXIT_ON_CLOSE);