Isi Kotak Pilihan yang ditentukan di FXML

Saya sedang mempelajari javaFX dan masalah saya adalah saya memiliki jendela sederhana dengan beberapa kotak pilihan dan tombol. Jendela ini ditentukan melalui FXML yang juga dikaitkan dengan kelas pengontrol. Saya ingin tahu, bagaimana cara mengisi kotak pilihan ini dengan data di kelas pengontrol, karena menggunakan referensi @FXML ke kotak pilihan ini throwsNullpointerEception

EDIT - menambahkan kode sumber kode FXML

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="240.0"
        prefWidth="320.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1"
        fx:controller="supermarket.ManageWindowCC">
<children>
    <ChoiceBox fx:id="countChoiceBox" layoutX="44.0" layoutY="71.0" prefHeight="25.0" prefWidth="191.0"/>
    <Label layoutX="44.0" layoutY="54.0" text="To change item's count, choose one"/>
    <TextField layoutX="140.0" layoutY="129.0" prefHeight="25.0" prefWidth="24.0"/>
    <Label layoutX="123.0" layoutY="112.0" text="New count"/>
    <Button layoutX="126.1875" layoutY="171.5" mnemonicParsing="false" text="Submit"/>
</children>

Java controller code:

public class ManageWindowCC {
@FXML
private ChoiceBox countChoiceBox;

public void onChangeCountClick(ActionEvent actionEvent) {

    try {
        Parent root = FXMLLoader.load(getClass().getResource("ChangeCount.fxml"));
        Stage newStage = new Stage();
        newStage.setTitle("Change item's count");
        newStage.setScene(new Scene(root, 320, 240));
        newStage.show();
        countChoiceBox = new ChoiceBox();
        countChoiceBox.setItems(FXCollections.observableArrayList("One","Two","Three"));

    } catch (IOException e) {
        e.printStackTrace();
    }
}
}

Terima kasih atas bantuan dan waktu Anda


person user2151486    schedule 14.04.2014    source sumber
comment
Silakan edit pertanyaan Anda dan tambahkan beberapa kode, mis. fxml dan kelas Controller, tempat Anda mereferensikan Choicebox.   -  person Patrick    schedule 14.04.2014


Jawaban (2)


Cara memperbaikinya

Hapus baris countChoiceBox = new ChoiceBox(); dan semuanya akan berfungsi dengan baik, dengan asumsi Anda tidak memiliki bug lain di aplikasi Anda.

Program ini akan menggunakan referensi ke countChoiceBox yang merupakan bagian dari hierarki node yang dibuat oleh FXMLLoader dan diatur dalam adegan Anda.

Apa yang terjadi

Memuat FXML baru di onChangeCountClick akan:

  1. Buat pengontrol supermarket.ManageWindowCC baru.
  2. Buat hierarki Node berdasarkan definisi FXML.
  3. Salah satu node dalam hierarki akan menjadi ChoiceBox.
  4. ChoiceBox yang dibuat secara otomatis oleh pemuat FXML untuk Anda akan ditetapkan ke anggota countChoiceBox.
  5. Anda kemudian mengambil hierarki node yang ditugaskan untuk root dan menambahkannya ke Scene baru di Tahap baru Anda.

Jadi, setelah Anda memuat FXML, countChoiceBox diinisialisasi ke ChoiceBox kosong yang dipakai oleh FXMLLoader Anda

Sejauh ini semuanya baik-baik saja. . .

Apa yang kemudian Anda lakukan adalah (salah) menulis:

countChoiceBox = new ChoiceBox();

Aturan praktis yang Anda langgar adalah => jangan pernah menggunakan new untuk memberikan nilai kepada anggota yang diberi tag @FXML.


Lihat juga contoh yang agak terkait untuk mengisi ComboBox menggunakan FXML (meskipun sampel tersebut menggunakan ComboBox dan mengisi datanya langsung di FXML, sehingga tidak dapat diterapkan langsung pada situasi Anda).

person jewelsea    schedule 14.04.2014
comment
Terima kasih atas penjelasan Anda yang sangat cerdas. Sekarang saya tahu bahwa kode ini seharusnya berfungsi. Pengecualian masih ada, tetapi seperti yang Anda sebutkan, pasti ada bug lain di kelas pengontrol lainnya. Saya belum memahami semua mekanisme dan hubungan antar windows. Untuk lebih spesifik: jendela ini akan ditampilkan setelah mengklik tombol yang ditempatkan di tahapan lain tetapi tahapan ini menggunakan pengontrol ManageWindowCC yang sama. Mungkin itulah alasan pengecualian Nullpointer - person user2151486; 14.04.2014
comment
Secara umum, jika Anda membuat mvce yang berisi kode lengkap dan mandiri yang dapat dikompilasi dan dijalankan seseorang tanpa modifikasi, ini adalah cara yang efektif dalam mendapatkan bantuan dan memastikan bahwa program Anda berfungsi sesuai keinginan. - person jewelsea; 15.04.2014
comment
Beberapa jam terakhir saya menelusuri stackowerflow dan saya menemukan jawaban profesional Anda di sini Anda yang terbaik . Saya akhirnya mengerti cara menyampaikan argumen antar pengontrol. Terima kasih banyak :) - person user2151486; 15.04.2014

@menggunakan FXML LANGKAH 1: Tambahkan kotak pilihan di pembuat adegan dan beri nama mungkin(choiceBox) LANGKAH 2: DI pengontrol tambahkan kode berikut @FXML private ChoiceBox choiceBox ;

@Override
public void initialize(URL url, ResourceBundle rb) {
 ObservableList<String> list = FXCollections.observableArrayList();
   list.addAll("choice1", "choice2","choice3");
  //populate the Choicebox;  
  choiceBox .setItems(list);

}
person Vax Okagbare    schedule 16.04.2018