Apa cara yang tepat untuk menghentikan aplikasi Swing dari kode, dan apa saja kekurangannya?
Saya mencoba menutup aplikasi saya secara otomatis setelah pengatur waktu menyala. Tapi hanya menelepon dispose()
pada JFrame
tidak melakukan trik - jendela lenyap tetapi aplikasi tidak mengakhiri. Namun saat menutup jendela dengan tombol tutup, aplikasi akan berhenti. Apa yang harus saya lakukan?
Jawaban:
Tindakan penutupan default JFrame Anda dapat disetel ke "
DISPOSE_ON_CLOSE
" daripadaEXIT_ON_CLOSE
(mengapa orang tetap menggunakan EXIT_ON_CLOSE berada di luar jangkauan saya).Jika Anda memiliki jendela yang tidak dibuang atau utas non-daemon, aplikasi Anda tidak akan dihentikan. Ini harus dianggap sebagai kesalahan (dan menyelesaikannya dengan System.exit adalah ide yang sangat buruk).
Penyebab paling umum adalah java.util.Timer dan Thread khusus yang Anda buat. Keduanya harus disetel ke daemon atau harus dimatikan secara eksplisit.
Jika Anda ingin memeriksa semua frame yang aktif, Anda dapat menggunakan
Frame.getFrames()
. Jika semua Windows / Frames dibuang, gunakan debugger untuk memeriksa utas non-daemon yang masih berjalan.sumber
back
jendela? Jika jendela kedua kemudian ditutup dan Anda menggunakanDISPOSE_ON_CLOSE
program tidak berhenti karena jendela pertama masih "tidak dibuang" ... apakah ada cara untuk menyelesaikannya tanpa menggunakanDISPOSE_ON_CLOSE
?Saya kira EXIT_ON_CLOSE
sebelumnya
System.exit(0)
lebih baik karena Anda dapat menulis Pendengar Jendela untuk melakukan beberapa operasi pembersihan sebelum benar-benar meninggalkan aplikasi.Pemroses jendela itu memungkinkan Anda untuk menentukan:
sumber
Mencoba:
Kasar, tapi efektif.
sumber
Mungkin cara yang aman adalah seperti:
sumber
Frame
dengan huruf kapital, persis seperti nama kelas…Program berikut menyertakan kode yang akan menghentikan program yang kekurangan utas asing tanpa secara eksplisit memanggil System.exit (). Untuk menerapkan contoh ini ke aplikasi yang menggunakan utas / pendengar / pengatur waktu / dll, seseorang hanya perlu menyisipkan kode pembersihan yang meminta (dan, jika ada, menunggu) penghentiannya sebelum WindowEvent dimulai secara manual dalam actionPerformed ().
Bagi mereka yang ingin menyalin / menempel kode yang mampu berjalan persis seperti yang ditunjukkan, metode utama yang sedikit jelek tetapi tidak relevan disertakan di bagian akhir.
sumber
Jika saya memahami Anda secara benar, Anda ingin menutup aplikasi meskipun pengguna tidak mengklik tombol tutup. Anda perlu mendaftarkan WindowEvents mungkin dengan addWindowListener () atau enableEvents () mana saja yang lebih sesuai dengan kebutuhan Anda.
Anda kemudian dapat menjalankan acara dengan panggilan ke processWindowEvent (). Berikut adalah contoh kode yang akan membuat JFrame, tunggu 5 detik dan tutup JFrame tanpa interaksi pengguna.
Seperti yang Anda lihat, metode processWindowEvent () menyebabkan acara WindowClosed dijalankan di mana Anda memiliki kesempatan untuk melakukan beberapa kode pembersihan jika Anda memerlukan sebelum menutup aplikasi.
sumber
Lihat Dokumentasi Oracle .
Mulai dari JDK 1.4, Aplikasi berakhir jika:
Cornercases:
Dokumen tersebut menyatakan bahwa beberapa paket membuat komponen yang dapat ditampilkan tanpa melepaskannya. Program yang memanggil Toolkit.getDefaultToolkit () tidak akan berhenti. antara lain diberikan sebagai contoh.
Juga Proses lain dapat membuat AWT tetap hidup ketika mereka, untuk alasan apa pun, mengirim peristiwa ke antrean peristiwa asli.
Juga saya perhatikan bahwa pada beberapa Sistem dibutuhkan beberapa detik sebelum Aplikasi benar-benar berhenti.
sumber
Saya pikir, idenya ada di sini WindowListener - Anda dapat menambahkan kode apa pun di sana yang ingin Anda jalankan sebelum semuanya dimatikan
sumber
Menanggapi komentar lain, DISPOSE_ON_CLOSE tampaknya tidak keluar dari aplikasi dengan benar - ini hanya merusak jendela, tetapi aplikasi akan terus berjalan. Jika Anda ingin menghentikan aplikasi, gunakan EXIT_ON_CLOSE.
sumber