Как сделать неукрашенное окно подвижным/перетаскиваемым в JavaFX?

Мне нужно создать приложение, в котором кнопка свертывания и развертывания будет отключена.

Я использовал "StageStyle.UNDECORATED", с которым приложение больше не будет перемещаться или перетаскиваться, поэтому я ищу любую другую альтернативу для создания моего приложения.

У кого-нибудь есть решение для этого?


person Shreyas Dave    schedule 03.11.2012    source источник
comment
Скрывает ли указанное выше свойство всю строку заголовка? Как вы планируете перетаскивать окно?   -  person Neil    schedule 07.11.2012
comment
Да, NeilGhosh, указанное выше свойство скрывает всю строку заголовка.   -  person Shreyas Dave    schedule 19.11.2012


Ответы (2)


Чтобы окно не было украшено, но по-прежнему можно было перемещать/перетаскивать, вы должны обработать соответствующий MouseEvent на любом узле по вашему выбору.

Пример:

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

person pmoule    schedule 19.11.2012
comment
Да, pmoule, это лучшее решение моей проблемы, и оно действительно очень полезно для меня. Большое спасибо за ваши усилия. - person Shreyas Dave; 20.11.2012
comment
Сработало именно так, большое спасибо за ваше время исследования ... мы использовали urs :-D - person TechDog; 25.05.2016

Единственная цель этого класса — разрешить перетаскивание недекорированного окна. Он также выполняет задачу обеспечения того, чтобы панель задач оставалась видимой в полноэкранном режиме, а неукрашенное окно не вытаскивалось за пределы экрана. Наконец, он предоставляет исправление ошибки «Ресурс CSS не найден». Просто вставьте приведенный ниже код в основной класс в переопределенном методе 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;
    }
}
person Benjamin Wasula    schedule 21.12.2017