เติม Choicebox ที่กำหนดใน FXML

ฉันกำลังเรียนรู้ javaFX และปัญหาของฉันคือฉันมีหน้าต่างธรรมดาที่มีกล่องตัวเลือกและปุ่ม หน้าต่างนี้ถูกกำหนดผ่าน FXML ซึ่งเชื่อมโยงกับคลาสคอนโทรลเลอร์ด้วย ฉันต้องการทราบวิธีการเติมข้อมูลในช่องตัวเลือกนี้ด้วยข้อมูลในคลาสคอนโทรลเลอร์เนื่องจากการใช้ @FXML อ้างอิงถึงช่องตัวเลือกนี้จะทำให้NullpointerEception

แก้ไข - เพิ่มซอร์สโค้ด โค้ด 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();
    }
}
}

ขอบคุณสำหรับความช่วยเหลือและเวลาของคุณ


person user2151486    schedule 14.04.2014    source แหล่งที่มา
comment
โปรดแก้ไขคำถามของคุณและเพิ่มโค้ด เช่น คลาส fxml และ Controller ที่คุณอ้างอิงถึง Choicebox   -  person Patrick    schedule 14.04.2014


คำตอบ (2)


วิธีแก้ไข

ลบบรรทัด countChoiceBox = new ChoiceBox(); แล้วทุกอย่างจะทำงานได้ดี โดยถือว่าคุณไม่มีข้อบกพร่องอื่นๆ ในแอปพลิเคชันของคุณ

โปรแกรมจะใช้การอ้างอิงถึง countChoiceBox ซึ่งเป็นส่วนหนึ่งของลำดับชั้นโหนดที่สร้างโดย FXMLLoader และตั้งค่าในฉากของคุณ

เกิดอะไรขึ้น

การโหลด FXML ใหม่ใน onChangeCountClick จะ:

  1. สร้างตัวควบคุม supermarket.ManageWindowCC ใหม่
  2. สร้างลำดับชั้นของโหนดตามข้อกำหนด FXML
  3. หนึ่งในโหนดในลำดับชั้นจะเป็น ChoiceBox
  4. ChoiceBox ซึ่งตัวโหลด FXML สร้างขึ้นสำหรับคุณโดยอัตโนมัติ จะถูกกำหนดให้กับสมาชิก countChoiceBox
  5. จากนั้นคุณจึงนำลำดับชั้นของโหนดที่ได้รับมอบหมายให้รูทและเพิ่มลงในฉากใหม่บนสเตจใหม่ของคุณ

ดังนั้น หลังจากที่คุณโหลด FXML แล้ว countChoiceBox จะถูกเตรียมใช้งานเป็น ChoiceBox ว่างที่สร้างอินสแตนซ์โดย FXMLLoader ของคุณ

ทั้งหมดนี้ดีจนถึงตอนนี้ . .

สิ่งที่คุณทำคือ (ไม่ถูกต้อง) เขียน:

countChoiceBox = new ChoiceBox();

กฎทั่วไปที่คุณละเมิดคือ => ห้ามใช้ new เพื่อสร้างการกำหนดค่าให้กับสมาชิกที่แท็ก @FXML


ดูตัวอย่างที่เกี่ยวข้องบ้างสำหรับ การเติม ComboBox โดยใช้ FXML (แม้ว่าตัวอย่างนั้นจะใช้ ComboBox และเติมข้อมูล ข้อมูลโดยตรงใน FXML ดังนั้นจึงไม่สามารถใช้ได้กับสถานการณ์ของคุณโดยตรง)

person jewelsea    schedule 14.04.2014
comment
ขอบคุณสำหรับคำอธิบายที่ชาญฉลาดจริงๆ ตอนนี้ฉันรู้แล้วว่ารหัสนี้ควรจะใช้งานได้ ข้อยกเว้นยังคงมีอยู่ แต่อย่างที่คุณพูดถึง จะต้องมีข้อบกพร่องอื่นๆ ในคลาสคอนโทรลเลอร์ที่เหลือ ฉันยังไม่เข้าใจกลไกและความสัมพันธ์ทั้งหมดระหว่างหน้าต่าง เพื่อให้เจาะจงมากขึ้น: หน้าต่างนี้ควรแสดงหลังจากคลิกปุ่มที่วางไว้ในสเตจอื่น แต่สเตจเหล่านี้ใช้คอนโทรลเลอร์ ManageWindowCC เดียวกัน ส้มอาจเป็นสาเหตุของข้อยกเว้น Nullpointer - person user2151486; 14.04.2014
comment
โดยทั่วไป หากคุณสร้าง mvce ซึ่งมีโค้ดแบบสแตนด์อโลนที่สมบูรณ์ซึ่งใครก็ตามสามารถคอมไพล์และดำเนินการได้โดยไม่ต้องแก้ไข นี่เป็นวิธีที่มีประสิทธิภาพในการ รับความช่วยเหลือและรับรองว่าโปรแกรมของคุณทำงานได้ตามต้องการ - person jewelsea; 15.04.2014
comment
ไม่กี่ชั่วโมงที่ผ่านมา ฉันกำลังค้นหา stackowerflow และพบคำตอบที่เป็นมืออาชีพของคุณแล้ว ที่นี่ คุณเก่งที่สุด . ในที่สุดฉันก็เข้าใจวิธีส่งข้อโต้แย้งระหว่างผู้ควบคุมแล้ว ขอบคุณมาก :) - person user2151486; 15.04.2014

@ การใช้ FXML ขั้นตอนที่ 1: เพิ่มกล่องตัวเลือกในตัวสร้างฉากและเรียกมันว่า (choiceBox) ขั้นตอนที่ 2: ในคอนโทรลเลอร์ให้เพิ่มรหัสต่อไปนี้ @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