Bagaimana saya bisa meneruskan parameter ke jendela sekunder di javafx? Apakah ada cara untuk berkomunikasi dengan pengontrol yang sesuai?
Misalnya: Pengguna memilih pelanggan dari TableView
dan jendela baru dibuka, menampilkan info pelanggan.
Stage newStage = new Stage();
try
{
AnchorPane page = (AnchorPane) FXMLLoader.load(HectorGestion.class.getResource(fxmlResource));
Scene scene = new Scene(page);
newStage.setScene(scene);
newStage.setTitle(windowTitle);
newStage.setResizable(isResizable);
if(showRightAway)
{
newStage.show();
}
}
newStage
akan menjadi jendela baru. Masalahnya adalah, saya tidak bisa menemukan cara untuk memberitahu controller di mana mencari info pelanggan (dengan melewatkan id sebagai parameter).
Ada ide?
Jawaban:
Pendekatan yang Disarankan
Jawaban ini menyebutkan mekanisme berbeda untuk memberikan parameter ke pengontrol FXML.
Untuk aplikasi kecil, saya sangat merekomendasikan melewati parameter langsung dari pemanggil ke controller - itu sederhana, mudah dan tidak memerlukan kerangka kerja tambahan.
Untuk aplikasi yang lebih besar dan lebih rumit, ada baiknya menyelidiki jika Anda ingin menggunakan Dependency Injection atau Event Bus mekanisme dalam aplikasi Anda.
Melewati Parameter Langsung Dari Pemanggil ke Pengontrol
Berikan data khusus ke pengontrol FXML dengan mengambil pengontrol dari instance loader FXML dan memanggil metode pada pengontrol untuk menginisialisasi dengan nilai data yang diperlukan.
Sesuatu seperti kode berikut:
FXMLLoader baru dibuat seperti yang ditunjukkan dalam contoh kode yaitu
new FXMLLoader(location)
. Lokasi adalah URL dan Anda dapat menghasilkan URL seperti itu dari sumber daya FXML dengan:Berhati-hatilah JANGAN menggunakan fungsi beban statis pada FXMLLoader, atau Anda tidak akan bisa mendapatkan controller dari instance loader Anda.
Instance FXMLLoader sendiri tidak pernah tahu apa-apa tentang objek domain. Anda tidak secara langsung mengirimkan objek domain khusus aplikasi ke konstruktor FXMLLoader, sebagai gantinya Anda:
Blog ini (oleh penulis lain) memberikan alternatif, tetapi serupa, contoh .
Mengatur Pengontrol pada FXMLLoader
Anda dapat membuat pengontrol baru dalam kode, meneruskan parameter apa pun yang Anda inginkan dari pemanggil ke konstruktor pengontrol. Setelah Anda membuat kontroler, Anda bisa mengaturnya pada instance FXMLLoader sebelum Anda memanggil metode
load()
instance .Untuk mengatur pengontrol pada loader (dalam JavaFX 2.x) Anda TIDAK BISA juga mendefinisikan
fx:controller
atribut dalam file fxml Anda.Karena batasan pada
fx:controller
definisi dalam FXML, saya pribadi lebih suka mendapatkan pengontrol dari FXMLLoader daripada mengatur pengontrol ke dalam FXMLLoader.Memiliki Pengendali Mengambil Parameter dari Metode Statis Eksternal
Metode ini dicontohkan oleh jawaban Sergey untuk Javafx 2.0 How-to Application.getParameters () dalam file Controller.java .
Gunakan Injeksi Ketergantungan
FXMLLoader mendukung sistem injeksi ketergantungan seperti Guice, Spring atau Java EE CDI dengan memungkinkan Anda untuk mengatur pabrik pengontrol khusus di FXMLLoader. Ini memberikan panggilan balik yang dapat Anda gunakan untuk membuat instance controller dengan nilai-nilai dependen yang diinjeksi oleh sistem injeksi dependensi masing-masing.
Contoh aplikasi JavaFX dan injeksi ketergantungan pengontrol dengan Spring disediakan dalam jawaban untuk:
Suatu pendekatan injeksi ketergantungan yang benar-benar baik dan bersih dicontohkan oleh kerangka kerja afterburner.fx dengan contoh aplikasi air-hacks yang menggunakannya. afterburner.fx bergantung pada JEE6 javax.inject untuk melakukan injeksi ketergantungan.
Gunakan Bus Acara
Greg Brown, pembuat dan implementasi spesifikasi FXML asli, sering menyarankan untuk mempertimbangkan penggunaan bus peristiwa, seperti Guava EventBus , untuk komunikasi antara pengontrol instantiated FXML dan logika aplikasi lainnya.
T&J tindak lanjut
Ini adalah solusi fungsional untuk suatu masalah. Tahap dikembalikan dari
showCustomerDialog
fungsi sehingga referensi ke sana dapat disimpan oleh kelas eksternal yang mungkin ingin melakukan sesuatu, seperti menyembunyikan panggung berdasarkan klik tombol di jendela utama, di lain waktu. Alternatif, solusi berorientasi objek dapat merangkum fungsionalitas dan referensi tahap di dalam objek CustomerDialog atau memiliki Tahap memperpanjang CustomerDialog. Contoh lengkap untuk antarmuka berorientasi objek ke dialog khusus yang merangkum FXML, pengontrol, dan data model berada di luar cakupan jawaban ini, tetapi dapat membuat posting blog yang bermanfaat bagi siapa pun yang cenderung membuatnya.Informasi tambahan disediakan oleh pengguna StackOverflow bernama @dzim
Contoh untuk Injeksi Ketergantungan Boot Musim Semi
Pertanyaan tentang bagaimana melakukannya "The Spring Boot Way", ada diskusi tentang JavaFX 2, yang saya jawab di permalink terlampir. Pendekatan ini masih valid dan diuji pada Maret 2016, pada Spring Boot v1.3.3.RELEASE: https://stackoverflow.com/a/36310391/1281217
Kadang-kadang, Anda mungkin ingin meneruskan hasil kembali ke pemanggil, dalam hal ini Anda dapat memeriksa jawaban untuk pertanyaan terkait:
sumber
Dalam contoh ini, kita akan menggunakan 5 file:
Semua file tercantum secara keseluruhan di bagian bawah posting ini.
Tujuan: Untuk mendemonstrasikan nilai passing dari
Controller1
keController2
dan sebaliknya.Alur Program:
TextField
, aButton
, dan aLabel
. KetikaButton
diklik, jendela kedua dimuat dan ditampilkan, termasuk teks yang dimasukkan dalamTextField
.TextField
, aButton
, dan aLabel
. ItuLabel
akan menampilkan teks yang dimasukkan dalamTextField
pada adegan pertama.TextField
dan mengklik nyaButton
, adegan pertamaLabel
diperbarui untuk menampilkan teks yang dimasukkan.Ini adalah demonstrasi yang sangat sederhana dan pasti bisa berdiri untuk perbaikan, tetapi harus membuat konsepnya sangat jelas.
Kode itu sendiri juga dikomentari dengan beberapa perincian tentang apa yang terjadi dan bagaimana caranya.
Main.java:
Controller1.java:
Controller2.java:
Layout1.fxml:
Layout2.fxml:
sumber
loader.setController(this)
dan menambahkan pengontrol dalam file FXML membuat crash aplikasiloader.getController()
javafx.scene.Node class memiliki sepasang metode setUserData (Object) dan Object getUserData ()
Yang bisa Anda gunakan untuk menambahkan info Anda ke Node.
Jadi, Anda dapat memanggil page.setUserData (info);
Dan controller dapat memeriksa, jika info diatur. Selain itu, Anda bisa menggunakan ObjectProperty untuk mentransfer data, jika diperlukan.
Amati dokumentasi di sini: http://docs.oracle.com/javafx/2/api/javafx/fxml/doc-files/introduction_to_fxml.html Sebelum frasa "Dalam versi pertama, handleButtonAction () ditandai dengan @FXML untuk memungkinkan markup yang ditentukan dalam dokumen pengontrol untuk memintanya. Pada contoh kedua, bidang tombol diberi catatan untuk memungkinkan loader menetapkan nilainya. Metode initialize () juga dijelaskan. "
Jadi, Anda harus mengaitkan pengontrol dengan simpul, dan mengatur data pengguna ke simpul tersebut.
sumber
Berikut adalah contoh untuk meneruskan parameter ke dokumen fxml melalui namespace.
Tentukan nilai
External Text
untuk variabel namespacelabelText
:sumber
FXMLLoader.CONTROLLER_KEYWORD
,FXMLLoader.LOCATION_KEY
,FXMLLoader.RESOURCES_KEY
dan setiap string yang digunakan sebagai nilai untukfx:id
atribut.Ini bekerja ..
Ingat pertama kali Anda mencetak nilai kelulusan Anda akan mendapatkan nol, Anda dapat menggunakannya setelah windows Anda dimuat, sama untuk semua yang Anda ingin kode untuk komponen lainnya.
sumber
Anda harus membuat satu Kelas Konteks.
Anda hanya perlu mengatur instance controller dalam inisialisasi menggunakan
dan Anda dapat menggunakannya dari seluruh aplikasi Anda hanya menggunakan
Sekarang Anda dapat melewatkan parameter ke pengontrol apa saja dari seluruh aplikasi.
sumber
Ya kamu bisa.
Anda perlu menambahkan controller pertama:
Kemudian di yang kedua mendeklarasikan klien, kemudian di bagian bawah controller Anda:
sumber
Berikut adalah contoh untuk menggunakan pengontrol yang disuntikkan oleh Guice.
Berikut ini adalah implementasi nyata dari loader:
Perhatikan contoh ini memuat tampilan ke tengah BoarderPane yang merupakan akar dari Scene di Panggung. Ini tidak relevan dengan contoh (detail implementasi kasus penggunaan khusus saya) tetapi memutuskan untuk membiarkannya karena beberapa mungkin merasa berguna.
sumber
Anda dapat memutuskan untuk menggunakan daftar yang dapat diamati publik untuk menyimpan data publik, atau hanya membuat metode setter publik untuk menyimpan data dan mengambil dari pengontrol yang sesuai
sumber
Mengapa menjawab pertanyaan 6 tahun?
Salah satu konsep paling mendasar yang bekerja dengan bahasa pemrograman apa pun adalah bagaimana menavigasi dari satu (jendela, formulir atau halaman) ke yang lain. Juga saat melakukan navigasi ini pengembang sering ingin meneruskan data dari satu (jendela, formulir atau halaman) dan menampilkan atau menggunakan data yang dilewati.
Sementara sebagian besar jawaban di sini memberikan contoh yang bagus untuk contoh bagaimana melakukannya, kami pikir kami akan menaikannya torehan atau dua atau tiga
Kami mengatakan tiga karena kami akan menavigasi antara tiga (jendela, formulir atau halaman) dan menggunakan konsep variabel statis untuk meneruskan data di sekitar (jendela, formulir atau halaman)
Kami juga akan memasukkan beberapa kode pengambilan keputusan sementara kami menavigasi
Mulai Pengontrol
Pengontrol Satu Halaman
Halaman Dua Pengendali
Di bawah ini adalah semua file FXML
sumber