ข้อยกเว้นเมื่อใช้ CheckListView ของ Controls FX

ฉันมี ข้อผิดพลาด :

Exception in thread "JavaFX Application Thread" java.lang.IndexOutOfBoundsException: Index: 0

ฉันคิดว่าเป็นเพราะฉันต้องใช้ Platform.runLater() แต่ดูเหมือนว่าข้อผิดพลาดไม่ได้มาจากสิ่งนี้

นี่คือฟังก์ชั่นที่ฉันพยายามแก้ไขด้วย Platform.runLater() :

public void setListAirportForFilter(ListAirport listAirport){
    this.myListAirport = listAirport;

    departureCheckListView.setItems(myListAirport.getObservableDepartureAirtport());
    arrivalCheckListView.setItems(myListAirport.getObservableArrivalAirport());

    departureCheckListView.getCheckModel().getCheckedItems().addListener(new ListChangeListener<String>() {
        @Override
        public void onChanged(ListChangeListener.Change<? extends String> c) {
            c.next();
            if(c.wasAdded()) {  
                observableForbiddenDeparture.add(c.getAddedSubList().get(0));
                System.out.println("Item Checked : " + c.getAddedSubList().get(0));
            } 
            else if (c.wasRemoved()) {
                observableForbiddenDeparture.remove(c.getAddedSubList().get(0));
                System.out.println("Item Unchecked : " + c.getRemoved().get(0));
            }
        }
     });

}

ข้อผิดพลาดเกิดขึ้นในกรณีที่สอง โดยถูกลบออก


person Evans Belloeil    schedule 19.06.2015    source แหล่งที่มา
comment
คุณสรุปได้อย่างไรว่าคุณควรใช้ runLater()? คือทำไมคุณถึงต้องการมัน?   -  person Uluk Biy    schedule 19.06.2015
comment
เนื่องจาก observableList นี้โต้ตอบกับ GUI   -  person Evans Belloeil    schedule 19.06.2015
comment
ฉันคิดว่าคุณไม่ต้องการมันที่นี่ เพราะหากการกระทำของผู้ใช้บางอย่างทริกเกอร์การเลือก มันก็อยู่ในเธรด ui แล้ว แต่หากคุณกำลังเปลี่ยน CheckedItems หรือ myListAirport.getObservableArrivalAirport หรือรายการอื่น ๆ คุณไม่ควรคิดว่าคุณเป็นผู้ฟังเหตุการณ์เพียงคนเดียว หากคุณเปลี่ยน CheckedItems สิ่งต่างๆ มากมายจะทริกเกอร์ ไม่เพียงแต่ผู้ฟังของคุณเท่านั้น แต่มุมมองจะพยายามตรวจสอบและวาดตัวเองใหม่ ดังนั้นคุณต้องใช้ Platform.runLater เมื่อคุณเปลี่ยนค่าที่สังเกตได้จริงในเธรดอื่น   -  person varren    schedule 19.06.2015
comment
IllegalStateException : Invalid Change state: next() must be called before inspecting the Change. โยนมาจากไหน?   -  person ItachiUchiha    schedule 19.06.2015
comment
@ItachiUchiha จากบรรทัดนี้: observableForbiddenArrival.add(c.getAddedSubList().get(0));   -  person Evans Belloeil    schedule 19.06.2015
comment
@EvansBelloeil คุณไม่ต้องการ Platform.runLater() เนื่องจากคุณสมบัติ JavaFX และตัวฟังการเปลี่ยนแปลงสามารถเรียกใช้งานได้บนเธรดที่ไม่ใช่ JavaFX ดังที่ @varren กล่าวเนื่องจากการกระทำของผู้ใช้ถูกทริกเกอร์ใน CheckListView ซึ่งหมายความว่าคุณอยู่ที่ JavaFX application thread แล้วและคุณไม่ต้องการมัน ยิ่งไปกว่านั้น ข้อยกเว้นเริ่มแรกของคุณคือ IndexOutOfBoundsException ซึ่งหมายความว่าคุณกำลังพยายามเข้าถึงค่าดัชนีในอาร์เรย์ที่ไม่มีอยู่   -  person ItachiUchiha    schedule 19.06.2015
comment
ตกลง ฉันขอโทษ ฉันเชื่อมโยงข้อยกเว้นนี้กับ Platform.runLater เสมอ และฉันพบคำตอบนี้บนเว็บเสมอ ฉันจะแก้ไขโพสต์ของฉันดังนั้น   -  person Evans Belloeil    schedule 19.06.2015


คำตอบ (1)


หากองค์ประกอบถูกลบออกและเรียก ListChangeListener การเปลี่ยนแปลงของคุณจะมีรายการ removed ไม่ใช่รายการ added

ในกรณีที่สองของคุณ คุณกำลังตรวจสอบ c.wasRemoved() ซึ่งหมายความว่าหากเป็นจริง องค์ประกอบจะถูกลบออกจาก ObservableList ค่าที่ถูกลบทั้งหมดของคุณจะถูกจัดเก็บไว้ในรายการย่อย getRemoved() และหากคุณพยายามดึงข้อมูล getAddedSubList() คุณจะได้รับรายการว่าง

คุณต้องใช้

observableForbiddenDeparture.remove(c.getRemoved().get(0));

แทน

observableForbiddenDeparture.remove(c.getAddedSubList().get(0));
person ItachiUchiha    schedule 19.06.2015