Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
JavaFX.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
4.88 Mб
Скачать

3.4 Лабораторна робота № 4. Технологія drag-and-drop у JavaFx-додатках. Використання стилів.

Мета роботи: Ознайомитись з технологією Drag-and-Drop в JavaFX, навчитися створювати файли стилів та змінювати зовнішній вигляд додатку.

КОРОТКІ ТЕОРЕТИЧНІ ВІДОМОСТІ

Drag-and-Drop

Drag-and-Dropце дуже комфортне та інтуітивне для користувача рішення, яке можна впровадити для реалізації певних задач. В JavaFX є можливість використання цієї технології не тільки в межах одного додатку, але і обмінюватися інформацією з іншими додатками JavaFX, додатками Java Client та з програмами сторонніх розробників, таких як Windows Explorer.

В Drag-and-Drop є два поняття — target (ціль) та source (джерело). Тобто target — це куди «кидають», а source — «що кидають». Ціллю та джерелом можуть бути Nodes і Scenes.

Данні, які переносяться, використовують dragboard, що має такий же самий інтерфейс як і clipboard, тільки використовується для передачі даних при Drag-and-Drop. В ролі даних можуть виступати: текст, зображення, URL, файли, рядки, байти. Клас javafx.scene.input.DragEvent є базовим класом для впровадження Drag-and-Drop. Також існує декілька типів передачі даних: COPY, MOVE, LINK.

Процес Drag-and-Drop може починатися викликом методу startDragAndDrop в обробнику події DRAG_DETECTED в джерелі:

final Text source = new Text(50, 100, "DRAG ME");

final Text target = new Text(300, 100, "DROP HERE");

source.setOnDragDetected(new EventHandler<MouseEvent>() {

public void handle(MouseEvent event) {

/* drag was detected, start a drag-and-drop gesture*/

/* allow any transfer mode */

Dragboard db = source.startDragAndDrop(TransferMode.ANY);

/* Put a string on a dragboard */

ClipboardContent content = new ClipboardContent();

content.putString(source.getText());

db.setContent(content);

event.consume();

}

});

За допомогою подій DRAG_OVER, DRAG_ENTERED, DRAG_EXITED можна кастомізувати момент знаходження джерел над ціллю:

target.setOnDragEntered(new EventHandler<DragEvent>() {

public void handle(DragEvent event) {

/* the drag-and-drop gesture entered the target */

/* show to the user that it is an actual gesture target */

if (event.getGestureSource() != target &&

event.getDragboard().hasString()) {

target.setFill(Color.GREEN);

}

event.consume();

}

});

target.setOnDragExited(new EventHandler<DragEvent>() {

public void handle(DragEvent event) {

/* mouse moved away, remove the graphical cues */

target.setFill(Color.BLACK);

event.consume();

}

});

Подія DRAG_DROPPED сигналізує, що користувач переніс джерело до цілі. Ця подія відноситься до цілі, на відміну від описаних вище. Щоб завершити процес Drag-and-Drop потрібно викликати метод setDropCompleted(Boolean):

target.setOnDragDropped(new EventHandler<DragEvent>() {

public void handle(DragEvent event) {

/* data dropped */

/* if there is a string data on dragboard, read it and use it */

Dragboard db = event.getDragboard();

boolean success = false;

if (db.hasString()) {

target.setText(db.getString());

success = true;

}

/* let the source know whether the string was successfully

* transferred and used */

event.setDropCompleted(success);

event.consume();

}

});

По закінченню цієї події відбувається остання подія — DRAG_DONE, яка інформує джерело про результат перенесення, отже з ним можна зробити необхідні дії:

source.setOnDragDone(new EventHandler<DragEvent>() {

public void handle(DragEvent event) {

/* the drag and drop gesture ended */

/* if the data was successfully moved, clear it */

if (event.getTransferMode() == TransferMode.MOVE) {

source.setText("");

}

event.consume();

}

});