Перетаскивание окна JavaFX по нажатию на область
Как отследить нажатие на конкретную область окна в JavaFX и после этого сделать возможность перетаскивания окна, используя только эту область?
У меня уже есть работающий код, но в нем перетаскивание окна происходит при нажатии на любую область окна. Я пытаюсь добиться работы программы, при которой перетаскивать окно можно будет только используя "Особую область". Использована часть кода из этого вопроса и за основу взят код из данных статей.
Полностью аналогичный вопрос уже задавался на stackoverflow, но для Python библиотеки PyQt5.
Скриншот запущенного приложения:
Мой код Main.java:
package me.vikkt.secondfx;
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.input.MouseEvent;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import java.io.IOException;
import java.io.InputStream;
import java.util.Objects;
public class Main extends Application {
private double xOffset;
private double yOffset;
@Override
public void start(Stage stage) throws IOException {
String fxmlFile = "/mainScene.fxml";
//InputStream iconStream = Objects.requireNonNull(getClass().getResourceAsStream("/icon.png"));
FXMLLoader loader = new FXMLLoader();
Parent root = loader.load(getClass().getResourceAsStream(fxmlFile));
Scene scene = getScene(stage, root);
//Image image = new Image(iconStream);
//stage.getIcons().add(image);
stage.setTitle("Забавное окно");
stage.initStyle(StageStyle.TRANSPARENT);
stage.setScene(scene);
stage.show();
}
private Scene getScene(Stage stage, Parent root) {
Scene scene = new Scene(root, Color.TRANSPARENT);
scene.setOnMousePressed(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
xOffset = stage.getX() - event.getScreenX();
yOffset = stage.getY() - event.getScreenY();
}
});
scene.setOnMouseDragged(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
stage.setX(event.getScreenX() + xOffset);
stage.setY(event.getScreenY() + yOffset);
}
});
return scene;
}
public static void main(String[] args) {
launch();
}
}
Файл mainScene.fxml:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.text.Font?>
<Pane maxHeight="-Infinity"
maxWidth="-Infinity"
minHeight="-Infinity"
minWidth="-Infinity"
prefHeight="400.0"
prefWidth="600.0"
style="-fx-background-radius: 20;"
xmlns="http://javafx.com/javafx/21">
<Pane layoutX="14.0" layoutY="14.0" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="42.0" prefWidth="574.0" style="-fx-background-color: #445533;">
<children>
<Label layoutX="14.0" prefHeight="43.0" prefWidth="505.0" text="Особая область">
<font>
<Font size="27.0" />
</font>
</Label>
</children>
</Pane>
<Label layoutX="14.0" layoutY="89.0" prefHeight="43.0" prefWidth="505.0" text="Обычная область">
<font>
<Font size="27.0" />
</font>
</Label>
</Pane>
P.S. Я впервые на stackoverflow и это моё первое JavaFX приложение. Заранее извиняюсь за огрехи в коде и неточности в вопросе. С радостью выслушаю предложения по исправлению кода, если что-то не так.