Java Tip 48: Cara membuat kelas MessageBox yang dapat digunakan kembali

Sebagai programmer dan konsultan, saya sering mengajukan pertanyaan (sering kali di newsgroup) seperti: "Mengapa kotak dialog modal saya terus terkunci?", "Bagaimana cara mengekstrak tombol mana yang diklik pengguna dalam OKCanceldialog saya ?" dan "Mengapa Java tidak memiliki MessageBox standar?" Di tip Java ini, saya telah memberikan satu solusi yang memperhitungkan semua pertanyaan ini. Jadi, apa jawaban yang mencakup semuanya ini? Kelas yang dapat digunakan kembali MessageBox(untuk Java 1.1 atau versi yang lebih baru) yang memungkinkan Anda untuk menampilkan pesan dan tombol yang dapat diklik di jendela browser dan mengumpulkan respons dari pengguna. Itu datang dalam bentuk JavaBean.

Minimal

Mari pertimbangkan apa yang kita inginkan dari sudut pandang use case . Kasus penggunaan adalah serangkaian langkah yang dilakukan aktor untuk mencapai tujuan. Mengenakan topi analis kami, alangkah baiknya jika kami memiliki MessageBoxkelas yang memungkinkan kami untuk mengajukan pertanyaan kepada pengguna dan mendapatkan respons, katakanlah, sebagai berikut:

MessageBox box = new MessageBox (ini); box.setTitle ("Hapus Konfirmasi"); box.addChoice ("Ya", "DeleteConfirmYes"); box.addChoice ("No", "DeleteConfirmNo"); box.addChoice ("Help", "DeleteConfirmHelp"); box.setCloseWindowCommand ("DeleteConfirmNo"); box.ask ("Anda yakin ingin menghapus pelanggan ini?");

Kode di atas adalah kasus penggunaan di tingkat serendah mungkin. Perhatikan bahwa kami dapat mengonfigurasi MessageBoxuntuk berbagai macam penggunaan - tidak hanya penggunaan terbatas yang memberikan tanggapan "Ya", "Tidak", atau "Batal." Ini adalah kesalahan umum pemula untuk membangun MessageBoxyang hanya menangani beberapa kombinasi tombol. Tapi begitu Anda mulai memahami konfigurabilitas, seperti yang ditunjukkan di sederhana ini MessageBox, Anda berada di jalur untuk mendesain kelas yang dapat digunakan kembali.

Untuk menerima pemberitahuan bahwa sebuah tombol diklik, kita harus menerapkan ActionListenerdan menguji perintah aksi di public void actionPerformed(Action evt).

Menambahkan fitur

Untuk MessageBoxmenjadi kelas yang dapat digunakan kembali dengan kualitas terbaik, kami memerlukan beberapa fitur lagi. Misalnya, bagaimana jika kita memiliki Framedan sedang membuka kotak dialog modal dengan menggunakan MessageBox? Tidak harus kita sediakan MessageBoxdengan kami Framesehingga ketika MessageBoxhilang, fokus akan kembali ke Frame? Yang perlu kami tambahkan adalah fitur kasus penggunaan opsional berikut:

box.setFrame (myFrame); 

Dengan GUI yang semakin dipoles sepanjang waktu di Web, bagaimana kami dapat meningkatkan MessageBoxdan memberikan kemudahan penggunaan yang lebih konseptual kepada pengguna? Salah satu cara untuk mencapai ini adalah dengan memungkinkan gambar ditampilkan bersama dengan pesannya. Untuk ini, kami perlu menambahkan fitur kasus penggunaan opsional tambahan:

box.useImageCanvas (lightBulbImage); 

Tetapi ini berarti klien harus membuat gambar, dan seringkali klien hanya ingin menggunakan gambar standar di direktori yang sama dengan MessageBox. Dalam kasus ini, kami menginginkan metode yang lebih mudah:

box.useImageCanvas ("LightBulb.gif"); 

Bagaimana jika kita menemukan diri kita sering menggunakan MessageBoxto sebagai pertanyaan yang menuntut jawaban ya dan tidak, sehingga menciptakan kotak jawaban "Ya" dan "Tidak"? Bagaimana jika, bahkan lebih sering, kita mengajukan pertanyaan yang paling baik dijawab dengan "Oke"? Dalam hal ini, fitur yang lebih berguna adalah:

box.askYesNo ("Apakah Java sekarang merupakan 3GL defacto untuk pengembang cerdas?"); 

dan:

box.askOkay ("James Gosling datang ke sini aku membutuhkanmu."); 

Persyaratan tambahannya adalah:

  • Dialog seharusnya tidak mematikan utas yang memanggilnya (lihat di bawah untuk bagian tentang apa itu deadlock)

  • Jendela akan menutup sendiri saat tombol diklik

  • Dialog harus berpusat pada layar agar mudah dibaca

  • Dialog harus modal , apakah Framedisediakan atau tidak . Yang kami maksud dengan modal adalah bahwa pengguna hanya dapat mengklik di MessageBoxjendela, tidak di tempat lain dalam aplikasi

Terakhir, yang Anda tunggu-tunggu: MessageBoxkode

Sekarang setelah persyaratan kami turun, kami dapat mengungkapkan yang menakjubkan MessageBox.

Periksa kode sumber MessageBoxdi jendela terpisah. Karena daftar kode ini terlalu panjang untuk disertakan dalam tip ini, kami hanya akan memeriksa sorotan kode. MessageBoxmenggunakan kelas lain yang dapat digunakan kembali: ImageCanvas. Perhatikan deklarasi kelas:

public class MessageBox mengimplementasikan Runnable, ActionListener, WindowListener, KeyListener {dan metode yang paling penting: public void ask (String message) {if (frame == null) {frame = new Frame (); frameNotProvided = true; } lain {frameNotProvided = false; } dialog = Dialog baru (frame, true); // Modal dialog.addWindowListener (ini); dialog.addKeyListener (ini); dialog.setTitle (judul); dialog.setLayout (BorderLayout baru (5, 5)); Panel messagePanel = createMultiLinePanel (pesan); if (imageCanvas == null) {dialog.add ("Center", messagePanel); } lain {Panel centerPanel = Panel baru (); centerPanel.add (imageCanvas); centerPanel.add (messagePanel); dialog.add ("Center", centerPanel); } dialog.add ("Selatan", buttonPanel); dialog.pack (); menegakkanMinimumSize (dialog, 200, 100); centerWindow (dialog); Toolkit.getDefaultToolkit (). Beep ();// Mulai utas baru untuk menampilkan dialog utas utas = utas baru (ini); thread.start (); }

Kami mengimplementasikan listener untuk menerima event ini, dan mengimplementasikannya Runnablesehingga kami dapat membuat thread Java yang bagus dan keren. Mari pelajari metode terkait:

public void run () {dialog.setVisible (true); }

Tidak bisa lebih sederhana lagi, bukan? Perhatikan ask(), kami memulai utas baru yang menyebabkan run()dipanggil, dan ini menunjukkan dialog. Inilah cara kita menghindari kebuntuan , yang sekarang akan kita jeda beberapa detik untuk membahas Web.

Deadlock: Definisi

Semua kode Java berjalan di utas atau utas. Saat memulai program Java dengan memanggil main(), misalnya, runtime Java akan membuat thread dan memanggil di main()dalam thread tersebut. Biasanya, main()metode ini akan membuat instance kelas titik masuk, yang akan menginisialisasi sistem dan menampilkan Frameatau Dialogkepada pengguna. Utas awal mati saat main()metode selesai dijalankan. Alasan runtime Java itu sendiri tidak berakhir adalah karena AWT telah menelurkan satu atau lebih utas pengguna untuk mengelola perilaku AWT, termasuk input pengguna melalui tombol dan semacamnya.

Saat pengguna mengklik sebuah tombol, "utas AWT" yang mendasari mengirimkan sebuah ActionEventke tombol ActionListeneryang memiliki metode tersebut actionPerformed(ActionEvent evt). Sekarang, misalkan actionPerformed(), Anda memutuskan untuk membuka kotak dialog modal untuk menanyakan sesuatu kepada pengguna. Ketika kotak dialog modal ditampilkan di layar, kode diblokir . ("Pemblokiran" berarti utas menunggu pemberitahuan untuk melanjutkan, yang, dalam kasus kotak dialog modal, tidak akan terjadi sampai jendela ditutup.) Ini berarti utas AWT yang dipanggil actionPerformed()sedang menunggu metode untuk kembali . Utas AWT tersebut sekarang tidak tersedia untuk memproses masukan pengguna, seperti pada kotak dialog yang baru saja kita buka - sehingga aplikasi Anda menemui jalan buntu. Kampret.

Untuk menghindari bencana kebuntuan ini, beralihlah ke bahasa yang "lebih baik" atau gunakan fitur lanjutan Java (yang membuat Java menjadi bahasa yang lebih baik). Cukup tunjukkan kotak dialog modal di utas baru, dan semuanya adalah persik dan mawar di Javaland. Inilah yang telah kami lakukan pada kode di atas. Jenis kebuntuan ini biasa terjadi sampai seseorang memahami penyebabnya dan memiliki solusi sederhana untuk mencegahnya.

Kesimpulan

Sisanya MessageBoxsudah cukup jelas. Pelajari MessageBoxkode dan MessageBoxTestaplikasinya dan bersenang-senanglah.

JavaWorld ingin menyampaikan Tip Java Anda ke seluruh dunia Java. Tulis tip dan trik Anda yang paling keren sekarang , dan kirimkan ke [email protected] . Anda mungkin menemukan diri Anda seorang penulis di JavaWorld dengan petunjuk bermanfaat Anda dipilih sebagai Tip Java berikutnya!

Jack Harich, alias "Happy Jack", adalah pria Renaisans yang suka bersenang-senang yang beralih ke perangkat lunak setelah kariernya sebagai pematung berakhir dengan cepat karena cedera leher. Saat ini dia adalah konsultan di Atlanta (Silicon Cotton Field of the South) dan sangat aktif dengan Grup Pengguna Java Atlanta, itu adalah Java As A Second Language SIG, dan Atlanta Java Consortium.

Pelajari lebih lanjut tentang topik ini

  • Unduh semua file yang diperlukan untuk program yang dijelaskan di atas di sini

    //images.techhive.com/downloads/idge/imported/article/jvw/1998/03/javatip48.zip

Artikel ini, "Tip Java 48: Cara membuat kelas MessageBox yang dapat digunakan kembali", awalnya diterbitkan oleh JavaWorld.