Как сделать незакрепленное окно подвижным/перетаскиваемым в JavaFX?
Мне нужно создать приложение, в котором кнопка "Свернуть и увеличить" будет отключена.
Я использовал "StageStyle.UNDECORATED"
, с которым приложение больше не будет перемещаться или перетаскиваться, поэтому я ищу любую другую альтернативу для моего приложения.
У кого есть решение для этого?
Ответы
Ответ 1
Чтобы добиться того, чтобы окно не было декорировано, но все еще подвижное/перетаскиваемое, вы должны обрабатывать соответствующий MouseEvent
на любом node по вашему выбору.
Пример:
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
public class SimpleWindowApplication extends Application {
private double xOffset = 0;
private double yOffset = 0;
public static void main(String[] args) {
launch(args);
}
@Override
public void start(final Stage primaryStage) {
primaryStage.initStyle(StageStyle.UNDECORATED);
BorderPane root = new BorderPane();
root.setOnMousePressed(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
xOffset = event.getSceneX();
yOffset = event.getSceneY();
}
});
root.setOnMouseDragged(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
primaryStage.setX(event.getScreenX() - xOffset);
primaryStage.setY(event.getScreenY() - yOffset);
}
});
Scene scene = new Scene(root, 800, 600);
primaryStage.setScene(scene);
primaryStage.show();
}
}
Узнайте больше из очень ценных примеров, приведенных на странице загрузки Oracle JavaFX в разделе: JavaFX Demos и Samples
Ответ 2
Единственная цель этого класса - разрешить перетаскивание неделанного окна. Он также выполняет обязанности по обеспечению того, чтобы TaskBar оставался видимым с помощью FullScreen и гарантировал, что незадекларированное окно не будет выведено из экрана.
Наконец, он обеспечивает исправление ошибки для ошибки "ресурс css не найден".
Просто вставьте код ниже в основном классе в метод overridden start(), когда будет показан этап "О ГОТОВЕ" или после него.
WindowStyle.allowDrag(root, stage);
WindowStyle.stageDimension(stage.getWidth(), stage.getHeight());
ПРИМЕЧАНИЕ. Вставьте вышеприведенное значение, если для параметра "Стадия" должно быть указано "ГОТОВ", чтобы оно отображалось или после него.
Для полноэкранного окна используйте:
WindowStyle.fullScreen(Stage stage);
Чтобы изменить размер предыдущего использования:
WindowStyle.restoreScreen(Stage stage);
Чтобы добавить пользовательские таблицы стилей к вашей сцене, просто вставьте под кодом в основном классе метод переопределения start() после определения вашей сцены.
scene.getStylesheets().add(WindowStyle.addStyleSheet(String css));
Имя css, которое будет использоваться для стилизации, может быть в форме: main.css
или styles/main.css
import javafx.geometry.Rectangle2D;
import javafx.scene.Parent;
import javafx.scene.input.MouseEvent;
import javafx.stage.Screen;
import javafx.stage.Stage;
/**
* @author: BENJAH
*/
public class WindowStyle {
private static final Rectangle2D SCREEN_BOUNDS= Screen.getPrimary()
.getVisualBounds();
private static double[] pref_WH, offset_XY;
private static String styleSheet;
private WindowStyle(String css) {
styleSheet= getClass().getResource(css).toString();
}
protected static void allowDrag(Parent root, Stage stage) {
root.setOnMousePressed((MouseEvent p) -> {
offset_XY= new double[]{p.getSceneX(), p.getSceneY()};
});
root.setOnMouseDragged((MouseEvent d) -> {
//Ensures the stage is not dragged past the taskbar
if (d.getScreenY()<(SCREEN_BOUNDS.getMaxY()-20))
stage.setY(d.getScreenY() - offset_XY[1]);
stage.setX(d.getScreenX() - offset_XY[0]);
});
root.setOnMouseReleased((MouseEvent r)-> {
//Ensures the stage is not dragged past top of screen
if (stage.getY()<0.0) stage.setY(0.0);
});
}
//Sets the default stage prefered width and height.
protected static void stageDimension(Double width, Double height) {
pref_WH= new double[]{width, height};
}
protected static void fullScreen(Stage stage) {
stage.setX(SCREEN_BOUNDS.getMinX());
stage.setY(SCREEN_BOUNDS.getMinY());
stage.setWidth(SCREEN_BOUNDS.getWidth());
stage.setHeight(SCREEN_BOUNDS.getHeight());
}
protected static void restoreScreen(Stage stage) {
stage.setX((SCREEN_BOUNDS.getMaxX() - pref_WH[0])/2);
stage.setY((SCREEN_BOUNDS.getMaxY() - pref_WH[1])/2);
stage.setWidth(pref_WH[0]);
stage.setHeight(pref_WH[1]);
}
protected static String addStyleSheet(String css) {
new WindowStyle(css);
return styleSheet;
}
}