Я работаю над созданием устройства записи экрана в JavaFX, и одна из утилит, которая является обязательной для устройства записи экрана, позволяет пользователю определять, какую область для записи.
Мне удалось создать недекорированную полупрозрачную Сцену, которую можно перетаскивать, чтобы определить область, и добавить кнопку закрыть, позволяющую пользователю подтвердить область, которая подлежит записи.
Как теперь разрешить пользователю изменять размер сцены, перетаскивая ее за края?
SSCCE:
перетаскивание пакета; импортировать javafx.application.Application; импортировать javafx.event.ActionEvent; импортировать javafx.event.EventHandler; импортировать javafx.geometry.Pos; импортировать javafx.geometry.Rectangle2D; импортировать javafx.scene.Scene; импортировать javafx.scene.SceneBuilder; импортировать javafx.scene.control.Button; импортировать javafx.scene.control.ButtonBuilder; импортировать javafx.scene.input.MouseEvent; импортировать javafx.scene.layout.StackPane; импортировать javafx.scene.layout.StackPaneBuilder; импортировать javafx.scene.paint.Color; импортировать javafx.stage.Screen; импортировать javafx.stage.Stage; импортировать javafx.stage.StageStyle; общественный класс DraggableStage расширяет приложение { Кнопка закрытия; держатель StackPane; Rectangle2D maxBounds; СценаСцена; двойное нажатиеX; двойное нажатие Y; двойной перетаскиваниеX; двойное перетаскиваниеY; @Override public void start (этап этапа) выдает исключение { финальный этап theStage = stage; // определяем размер экрана maxBounds = Screen.getPrimary().getVisualBounds(); //создаем кнопку закрытия закрыть = ButtonBuilder .создавать() .text("Закрыть") .строить(); //создаем держатель StackPane для кнопки держатель = StackPaneBuilder .создавать() .alignment(Поз.ЦЕНТР) .дети рядом) .строить(); // вы не можете изменить размер экрана, превышающий максимальное разрешение экрана Holder.setMaxSize(maxBounds.getWidth(), maxBounds.getHeight()); //вы не можете изменить размер меньше половины ширины и высоты экрана Holder.setMinSize(maxBounds.getWidth()/2,maxBounds.getHeight()/2); //сцена, где все это происходит theScene = SceneBuilder .создавать() .root(держатель) .width(maxBounds.getWidth()/2) .height(maxBounds.getHeight()/2) .строить(); // добавляем прослушиватели кнопок close.setOnAction(new EventHandler(){ @Override public void handle (событие ActionEvent) { theStage.close(); } }); // добавляем прослушиватель перетаскивания и нажатия для StackPane Holder.setOnMousePressed(new EventHandler(){ @Override public void handle(MouseEvent e) { нажатыйX = e.getX(); нажатыйY = e.getY(); } }); Holder.setOnMouseDragged(new EventHandler(){ @Override public void handle(MouseEvent e) { перетащилX = e.getX(); перетащилY = e.getY(); двойная разницаX = перетащилX - нажалX; двойная разницаY = перетащилY - нажалY; theStage.setX(theStage.getX() + разницаX); theStage.setY(theStage.getY() + разницаY); } }); //обязательная ерунда theScene.setFill(Color.rgb(128, 128, 128, 0,5)); stage.initStyle(StageStyle.TRANSPARENT); stage.setScene(theScene); stage.sizeToScene(); сцена.шоу(); } public static void main(String[] args) { Application.launch("draggable.DraggableStage"); } } Изображение:
