Saya mengembangkan aplikasi yang menampilkan gambar, dan memutar suara dari database. Saya mencoba memutuskan apakah akan menggunakan JFrame terpisah atau tidak untuk menambahkan gambar ke database dari GUI.
Saya hanya ingin tahu apakah itu praktik yang baik untuk menggunakan beberapa jendela JFrame?
java
swing
user-interface
jframe
Penjaja
sumber
sumber
Jawaban:
Praktek yang buruk (buruk, buruk).
Ada beberapa cara untuk menampilkan banyak elemen dalam satu GUI, misalnya:
CardLayout
( demo singkat . ). Baik untuk:JInternalFrame
SayaJDesktopPane
biasanya digunakan untuk MDI .JTabbedPane
untuk kelompok komponen.JSplitPane
Cara untuk menampilkan dua komponen yang penting antara satu atau yang lain (ukuran) bervariasi sesuai dengan apa yang dilakukan pengguna.JLayeredPane
jauh banyak komponen baik ..layered.JToolBar
biasanya berisi grup tindakan atau kontrol. Dapat diseret di sekitar GUI, atau mematikannya sepenuhnya sesuai dengan kebutuhan pengguna. Seperti yang disebutkan di atas, akan meminimalkan / mengembalikan sesuai dengan yang dilakukan orang tua.JList
(contoh sederhana di bawah).JTree
.Tetapi jika strategi itu tidak berhasil untuk kasus penggunaan tertentu, coba yang berikut ini. Buat satu induk tunggal
JFrame
, kemudian buatJDialog
atauJOptionPane
instans muncul untuk elemen bebas-mengambang lainnya, menggunakan bingkai sebagai induk untuk dialog.Banyak gambar
Dalam hal ini di mana beberapa elemen adalah gambar, akan lebih baik menggunakan salah satu dari berikut ini sebagai gantinya:
JLabel
(berpusat di panel gulir) untuk menampilkan gambar mana saja yang diminati pengguna pada saat itu. Seperti yang terlihat diImageViewer
.JList
. Seperti yang terlihat dalam jawaban ini . Bagian 'baris tunggal' itu hanya berfungsi jika semuanya memiliki dimensi yang sama. Sebagai alternatif, jika Anda siap untuk menskala gambar dengan cepat, dan semuanya memiliki rasio aspek yang sama (mis. 4: 3 atau 16: 9).sumber
JFrame
s sebelumnya dan tidak pernah mempertimbangkan masalah itu, terima kasih telah menjelaskan!Berbagai
JFrame
pendekatan telah saya terapkan sejak saya mulai memprogram aplikasi Swing. Sebagian besar, saya melakukannya pada awalnya karena saya tidak tahu apa-apa. Namun , ketika saya semakin matang dalam pengalaman dan pengetahuan saya sebagai pengembang dan mulai membaca dan menyerap pendapat dari banyak pengembang Java yang lebih berpengalaman secara online, saya berusaha untuk beralih dari berbagaiJFrame
pendekatan (baik dalam proyek saat ini dan proyek masa depan ) hanya untuk bertemu dengan ... dapatkan ini ... penolakan dari klien saya! Ketika saya mulai menerapkan dialog modal untuk mengontrol "child" windows danJInternalFrame
s untuk komponen yang terpisah, klien saya mulai mengeluh!Saya cukup terkejut, karena saya melakukan apa yang saya pikir merupakan praktik terbaik! Tapi, seperti kata mereka, "Istri yang bahagia adalah hidup yang bahagia." Hal yang sama berlaku untuk klien Anda. Tentu saja, saya seorang kontraktor sehingga pengguna akhir saya memiliki akses langsung ke saya, pengembang, yang jelas bukan skenario umum.Jadi, saya akan menjelaskan manfaat dari
JFrame
pendekatan berganda , serta mitos-bust beberapa kontra yang disajikan orang lain.JFrame
, Anda memberi pengguna akhir Anda kemampuan untuk menyebar dan mengontrol apa yang ada di layarnya. Konsepnya terasa "terbuka" dan tidak membatasi. Anda kehilangan ini ketika Anda pergi ke satu besarJFrame
dan banyakJInternalFrame
.JFrame
s. Namun, saya ingin layar entri data menjadiJDialog
yang orang tuanya adalah penampil data. Saya melakukan perubahan, dan segera saya menerima telepon dari pengguna akhir yang sangat bergantung pada fakta bahwa dia dapat meminimalkan atau menutup pemirsa dan tetap membuka editor sementara dia mereferensikan bagian lain dari program (atau situs web, saya tidak ingat). Dia tidak menggunakan multi-monitor, jadi dia perlu entri dialog menjadi yang pertama dan yang lainnyamenjadi yang kedua, dengan penampil data yang sepenuhnya tersembunyi. Ini tidak mungkin denganJDialog
dan tentu saja tidak mungkin denganJInternalFrame
. Dengan enggan saya mengubahnya kembali menjadi terpisahJFrames
karena kewarasannya, tetapi itu memberi saya pelajaran penting.JInternalFrame
daripadaJFrame
. Bahkan, dalam pengalaman saya,JInternalFrames
menawarkan fleksibilitas yang jauh lebih sedikit. Saya telah mengembangkan cara sistematis untuk menangani pembukaan & penutupanJFrame
aplikasi saya yang benar-benar berfungsi dengan baik. Saya mengontrol frame hampir sepenuhnya dari dalam kode frame itu sendiri; pembuatan bingkai baru,SwingWorker
yang mengontrol pengambilan data pada utas latar belakang dan kode GUI pada EDT, mengembalikan / membawa ke depan bingkai jika pengguna mencoba membukanya dua kali, dll. Yang Anda butuhkan untuk membukaJFrame
adalah memanggil metode statis publikopen()
dan metode terbuka, dikombinasikan dengan awindowClosing()
event menangani sisanya (apakah frame sudah terbuka? apakah tidak terbuka, tetapi memuat? dll.) Saya membuat pendekatan ini sebagai template sehingga tidak sulit untuk diterapkan untuk setiap frame.JFrame
kebutuhan lebih banyak ruang daripadaJInternalFrame
, bahkan jika Anda membuka 100-JFrame
an, berapa banyak sumber daya yang akan Anda konsumsi? Jika kekhawatiran Anda adalah kebocoran memori karena sumber daya: panggilandispose()
membebaskan semua sumber daya yang digunakan oleh frame untuk pengumpulan sampah (dan, sekali lagi saya katakan, aJInternalFrame
harus meminta perhatian yang sama persis).Saya sudah banyak menulis dan saya merasa bisa menulis lebih banyak. Ngomong-ngomong, saya harap saya tidak terpilih sebagai pemilih karena itu pendapat yang tidak populer. Pertanyaannya jelas merupakan pertanyaan yang berharga dan saya harap saya telah memberikan jawaban yang berharga, meskipun itu bukan pendapat umum.
Contoh yang bagus dari banyak frame / dokumen tunggal per frame ( SDI ) vs frame tunggal / beberapa dokumen per frame ( MDI ) adalah Microsoft Excel. Beberapa manfaat MDI:
SDI (Single-Document Interface, yaitu, setiap jendela hanya dapat memiliki satu dokumen):
MDI (Antarmuka Multi-Dokumen, yaitu, setiap jendela dapat memiliki banyak dokumen):
sumber
JFrame
dan orangtua yang besarJTabbedPane
; tetapi dengan kemungkinan untuk membuka jendela kedua (atau bahkan lebih) di mana tata letak bisa berbeda, menawarkan karenanya perilaku hybrid di mana pecinta SDI senang dan yang MDI juga. Dalam semua kasus, saya selalu dianggapJInternalFrame
sebagai pola mengerikan yang memberi Anda semua ketidaknyamanan dari kedua dunia. Fleksibilitas yang mereka tawarkan hanya menyebalkan dan mereka memakan banyak ruang layar yang berharga tanpa tujuan nyata.JFrame
- masing mendapat ikon taskbar sendiri. Terkadang ini persis apa yang Anda inginkan, tetapi terkadang tidak. Di WinAPI ini mudah untuk dikonfigurasi, tetapi di Swing sepertinya tidak bisa dilakukan.JDialog
lebih dari satuJFrame
.Saya ingin melawan argumen "tidak ramah pengguna" dengan contoh yang baru saja saya gunakan.
Dalam aplikasi kami, kami memiliki jendela utama di mana pengguna menjalankan berbagai 'program' sebagai tab terpisah. Sebisa mungkin kami telah mencoba untuk menjaga aplikasi kami ke jendela tunggal ini.
Salah satu 'program' yang mereka jalankan menyajikan daftar laporan yang telah dihasilkan oleh sistem, dan pengguna dapat mengklik ikon di setiap baris untuk membuka dialog penampil laporan. Penampil ini menunjukkan setara dengan halaman potret / lansekap A4 laporan, sehingga pengguna menyukai jendela ini menjadi cukup besar, hampir memenuhi layar mereka.
Beberapa bulan yang lalu kami mulai mendapatkan permintaan dari pelanggan kami untuk membuat model jendela penampil laporan ini, sehingga mereka dapat membuka banyak laporan sekaligus.
Untuk beberapa waktu saya menolak permintaan ini karena saya tidak berpikir ini adalah solusi yang baik. Namun, pikiran saya berubah ketika saya mengetahui bagaimana para pengguna mengatasi 'kekurangan' sistem kami.
Mereka membuka pemirsa, menggunakan fasilitas 'Simpan Sebagai' untuk menyimpan laporan sebagai PDF ke direktori tertentu, menggunakan Acrobat Reader untuk membuka file PDF, dan kemudian mereka akan melakukan hal yang sama dengan laporan berikutnya. Mereka akan memiliki beberapa Acrobat Readers berjalan dengan berbagai keluaran laporan yang ingin mereka lihat.
Jadi saya mengalah dan membuat modeless penonton. Ini berarti bahwa setiap pengunjung memiliki ikon bilah tugas.
Ketika versi terbaru dirilis kepada mereka minggu lalu, respon luar biasa dari mereka adalah bahwa mereka MENYUKAINYA. Ini adalah salah satu peningkatan terbaru kami yang paling populer untuk sistem.
Jadi Anda teruskan dan beri tahu pengguna Anda bahwa apa yang mereka inginkan buruk, tetapi pada akhirnya itu tidak akan membantu Anda.
BEBERAPA CATATAN:
ModalityType
alih - alih booleanmodal
. Inilah yang memberi dialog ini ikon bilah tugas.sumber
Buat jInternalFrame menjadi bingkai utama dan membuatnya tidak terlihat. Kemudian Anda dapat menggunakannya untuk acara selanjutnya.
sumber
Sudah lama sejak terakhir kali saya menyentuh ayunan tetapi secara umum adalah praktik yang buruk untuk melakukan ini. Beberapa kelemahan utama yang terlintas dalam pikiran:
Ini lebih mahal: Anda harus mengalokasikan sumber daya jauh lebih banyak untuk menggambar JFrame jenis lain dari wadah jendela, seperti Dialog atau JInternalFrame.
Tidak ramah pengguna: Tidak mudah menavigasi ke sekelompok JFrame yang terjebak bersama, itu akan terlihat seperti aplikasi Anda adalah sekumpulan aplikasi yang desainnya tidak konsisten dan buruk.
Sangat mudah untuk menggunakan JInternalFrame Ini semacam retorical, sekarang jauh lebih mudah dan orang lain lebih pintar (atau dengan waktu luang lebih banyak) daripada yang telah kita pikirkan melalui pola Desktop dan JInternalFrame, jadi saya akan merekomendasikan untuk menggunakannya.
sumber
JInternalFrame
juga? Secara pribadi, saya tidak setuju dengan penggunaanJInternalFrame
's!CardLayout
adalah berkah yang nyata!JInternalFrame
tidak menawarkan keuntungan dalam salah satu dari tiga kasus yang Anda sebutkan (1. di mana bukti yangJInternalFrame
lebih ringan dariJFrame
? 2.JInternalFrame
S Anda bisa sama berantakan / berantakan / terjebak bersama sebagai sekelompokJFrame
s. 3. BagaimanaJInternalFrame
lebih mudah? Ini adalah kode yang sama persis, kecuali satu yang terkandung dalamJDesktopPane
dan satu terkandung dalam area layar alami Mereka terdengar sama rumit untuk saya)..JComponent
s, keduanya memiliki struktur yang hampir identik, kecuali satu diberikan pada aJDesktop
dan satu tidak. Sekali lagi, maaf, tapi saya yakin Anda berspekulasi tentang "berat" dariJFrame
. 2. Aplikasi saya menggunakan SDI dan klien saya sangat senang. Namun, Anda mengatakan "satu ton jendela," yang tentu saja akan payah. Tapi, maksud saya adalah ini: "satu ton"JInternalFrame
akan mengisap sama buruknya! Jika Anda mengatakan JIF memungkinkan Anda untuk menjadi desainer UI yang ceroboh, maka itu mengerikan. Kekacauan berantakan adalah kekacauan berantakan, apakah JF atau JIF.Praktek yang buruk pasti. Salah satu alasannya adalah bahwa itu tidak terlalu 'user-friendly' karena setiap
JFrame
menunjukkan ikon taskbar baru. Mengontrol banyakJFrame
s akan membuat Anda merobek rambut.Secara pribadi, saya akan menggunakan SATU
JFrame
untuk jenis aplikasi Anda. Metode menampilkan banyak hal terserah Anda, ada banyak.Canvas
es,JInternalFrame
,CardLayout
, bahkanJPanel
s mungkin.Beberapa objek JFrame = Nyeri, masalah, dan masalah.
sumber
Saya pikir menggunakan beberapa
Jframe
bukan ide yang baik.Sebaliknya, kita dapat menggunakan
JPanel
lebih dari satu atau lebihJPanel
yang samaJFrame
.Kita juga bisa beralih di antara ini
JPanel
. Jadi itu memberi kita kebebasan untuk menampilkan lebih dari pada sesuatu diJFrame
.Untuk masing-masing
JPanel
kita dapat merancang hal-hal yang berbeda dan semua iniJPanel
dapat ditampilkan padaJFrame
satu per satu.Untuk beralih di antara
JPanel
penggunaan iniJMenuBar
denganJMenuItems
untuk masing-masingJPanel
atau 'JButtonfor each
JPanel`.Lebih dari satu
JFrame
bukanlah praktik yang baik, tetapi tidak ada yang salah jika kita menginginkan lebih dari satuJFrame
.Tetapi lebih baik mengubah satu
JFrame
untuk kebutuhan kita yang berbeda daripada memiliki banyakJFrame
.sumber
Jika bingkai akan memiliki ukuran yang sama, mengapa tidak membuat bingkai dan meneruskannya sebagai referensi.
Ketika Anda telah melewati bingkai Anda kemudian dapat memutuskan bagaimana mengisinya. Ini akan seperti memiliki metode untuk menghitung rata-rata satu set angka. Apakah Anda akan membuat metode berulang kali?
sumber
Ini bukan praktik yang baik tetapi meskipun Anda ingin menggunakannya Anda dapat menggunakan pola tunggal sebagai yang baik. Saya telah menggunakan pola tunggal di sebagian besar proyek saya itu bagus.
sumber