JavaFX มี MouseEvents ที่คล้ายกันมากมายสำหรับ ImageViews

สวัสดี ฉันมีปัญหากับเหตุการณ์การลากและวางที่คล้ายกันจำนวนมากสำหรับรูปภาพ ซึ่งฉันย้ายโดยมีป้ายกำกับไปยังมุมมองรูปภาพอื่นๆ

ตัวอย่างรหัส:

//drag and drope for imageview01
@FXML
private void handleDragDetected1(MouseEvent event) {
      Dragboard db = imageview01.startDragAndDrop(TransferMode.ANY);
      ClipboardContent cb = new ClipboardContent();
      cb.putImage(imageview01.getImage());
      cb.putString(imageview01_label.getText());
      db.setContent(cb);
      System.out.println("Picture 1 is draged");
}
...
...
//drag and drope for imageview100
@FXML
private void handleDragDetected100(MouseEvent event) {
     ...
     ...
}

มีวิธีแก้ไขโค้ดให้สั้นลงหรือไม่?


person Marek Krištof    schedule 27.02.2017    source แหล่งที่มา
comment
อย่าโยงตัวจัดการเหตุการณ์นับร้อยผ่าน FXML ให้ใช้โค้ดวนซ้ำแทน   -  person jewelsea    schedule 27.02.2017
comment
วงนี้มีลักษณะอย่างไร?   -  person Marek Krištof    schedule 27.02.2017


คำตอบ (1)


คุณสามารถกำหนด Labels เป็น userData ของ ImageViews ที่เกี่ยวข้องได้ ซึ่งอนุญาตให้คุณใช้แหล่งที่มาของเหตุการณ์เพื่อดึงข้อมูล Label ดังนั้นจึงอนุญาตให้คุณใช้ตัวจัดการเหตุการณ์เดียวกันสำหรับ ImageViews ทั้งหมด

ตัวอย่างต่อไปนี้ใช้เหตุการณ์ Button และ onMouseClicked เพื่อความเรียบง่าย แต่แนวทางเดียวกันนี้ก็ใช้ได้กับปัญหาของคุณด้วย:

เอฟเอ็กซ์เอ็มแอล

<Label text="Hello World" fx:id="label1"/>
<Button text="Print Label 1" onMouseClicked="#click" userData="$label1"/>

คอนโทรลเลอร์

@FXML
private void click(MouseEvent event) {
    // retrieve the node the event occured on
    Button btn = (Button) event.getSource();

    // retrieve Label associated with event source
    Label label = (Label) btn.getUserData();

    // now we've got all info we need without using any field of the controller
    System.out.println(label.getText());
}

(คุณไม่จำเป็นต้องมีฟิลด์ label1 ในคอนโทรลเลอร์ด้วยซ้ำ)

person fabian    schedule 27.02.2017
comment
ขอบคุณ. มันจะเป็นอย่างไรใน FXML และ Contoller ถ้าฉันต้องการ setUserdata สำหรับป้ายกำกับ - person Marek Krištof; 04.03.2017
comment
@ MarekKrištof โปรดชี้แจงสิ่งที่คุณหมายถึง *it*? Why use setUserData` ของป้ายกำกับคืออะไร และคุณต้องการตั้งค่าเป็นเท่าใด - person fabian; 05.03.2017
comment
ดังนั้นฉันจึงมี imageview บนเหตุการณ์ลากที่ฉันกำหนดข้อมูลผู้ใช้ (ป้ายกำกับ) ถัดไป ia มีเหตุการณ์ดรอปที่ฉันมี imageview ด้วย ใน imageview นี้ฉันตั้งค่ารูปภาพจากเหตุการณ์ลากและฉันยังมีป้ายกำกับ .. และป้ายกำกับเฉพาะนี้ซึ่งฉันต้องกำหนด ไปยัง imegaview ที่เฉพาะเจาะจง - person Marek Krištof; 07.03.2017