国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

JavaFx中Controller獲取Stage并自定義窗口移動(dòng)與縮放邏輯

Alliot / 2668人閱讀

摘要:中獲取并自定義窗口移動(dòng)與縮放邏輯由于去掉了平臺(tái)自帶了標(biāo)題欄,窗口就無(wú)法移動(dòng)和縮放了,需要我們自己來(lái)實(shí)現(xiàn)。

JavaFx中Controller獲取Stage并自定義窗口移動(dòng)與縮放邏輯

由于去掉了平臺(tái)自帶了標(biāo)題欄,窗口就無(wú)法移動(dòng)和縮放了,需要我們自己來(lái)實(shí)現(xiàn)。

去除窗口標(biāo)題欄
public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("main.fxml"));
        primaryStage.setTitle("main");
        // 主要是這一句
        primaryStage.initStyle(StageStyle.TRANSPARENT);
        primaryStage.setScene(new Scene(root));
        primaryStage.show();
    }


    public static void main(String[] args) {
        launch(args);
    }
}
在Controller中獲取Stage

首先確定在Controller中獲取到你的跟布局對(duì)象,如下:

public class Controller implements Initializable {
    public BorderPane root;
    private Stage stage;
}

      

然后可以在public void initialize(URL url, ResourceBundle resourceBundle) 方法內(nèi)獲取Stage

public class Controller implements Initializable {
    public BorderPane root;
    private Stage stage;

    @Override
    public void initialize(URL url, ResourceBundle resourceBundle) {
       var stage = getStage();
    }

    private Stage getStage() {
        if (stage == null) {
            stage = (Stage) root.getScene().getWindow();
        }
        return stage;
    }

}
自定義窗體移動(dòng)與縮放邏輯

記錄鼠標(biāo)坐標(biāo)

 root.setOnMousePressed(event -> {
            event.consume();
            xOffset = event.getSceneX();
            yOffset = event.getSceneY();
        });

自定義移動(dòng)控制區(qū)域

dragArea.setOnMouseDragged(event -> {
            event.consume();
            var stage = getStage();
            stage.setX(event.getScreenX() - xOffset);
            stage.setY(event.getScreenY() - yOffset);
        });

判斷鼠標(biāo)坐標(biāo)位置,并處理光標(biāo)變換

root.setOnMouseMoved(this::mouseMoveHandle);

 private void mouseMoveHandle(MouseEvent event) {
        event.consume();
        double x = event.getSceneX();
        double y = event.getSceneY();
        var stage = getStage();
        double width = stage.getWidth();
        double height = stage.getHeight();
        Cursor cursorType = Cursor.DEFAULT;
        bit = 0;
        if (y >= height - RESIZE_WIDTH) {
            if (x <= RESIZE_WIDTH) {
                bit |= 1 << 3;
            } else if (x >= width - RESIZE_WIDTH) {
                bit |= 1;
                bit |= 1 << 2;
                cursorType = Cursor.SE_RESIZE;
            } else {
                bit |= 1;
                cursorType = Cursor.S_RESIZE;
            }
        } else if (x >= width - RESIZE_WIDTH) {
            bit |= 1 << 2;
            cursorType = Cursor.E_RESIZE;
        }
        root.setCursor(cursorType);
    }

處理窗口縮放

root.setOnMouseDragged(this::mouseDraggedHandle);

private void mouseDraggedHandle(MouseEvent event) {
    event.consume();
    var primaryStage = getStage();
    double x = event.getSceneX();
    double y = event.getSceneY();
    double nextX = primaryStage.getX();
    double nextY = primaryStage.getY();
    double nextWidth = primaryStage.getWidth();
    double nextHeight = primaryStage.getHeight();
    if ((bit & 1 << 2) != 0) {
        nextWidth = x;
    }
    if ((bit & 1) != 0) {
        nextHeight = y;
    }
    if (nextWidth <= MIN_WIDTH) {
        nextWidth = MIN_WIDTH;
    }
    if (nextHeight <= MIN_HEIGHT) {
        nextHeight = MIN_HEIGHT;
    }
    primaryStage.setX(nextX);
    primaryStage.setY(nextY);
    primaryStage.setWidth(nextWidth);
    primaryStage.setHeight(nextHeight);
}

完整代碼
package line.main;

import javafx.fxml.Initializable;
import javafx.scene.Cursor;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;

import java.net.URL;
import java.util.ResourceBundle;

public class Controller implements Initializable {
    public BorderPane root;
    public Pane dragArea;
    private Stage stage;
    private double xOffset = 0;
    private double yOffset = 0;
    private int bit = 0;//left,right,top,bottom
    private static final double RESIZE_WIDTH = 5.00;
    private static final double MIN_WIDTH = 600.00;
    private static final double MIN_HEIGHT = 400.00;

    @Override
    public void initialize(URL url, ResourceBundle resourceBundle) {
        dragArea.setOnMouseDragged(event -> {
            event.consume();
            var stage = getStage();
            stage.setX(event.getScreenX() - xOffset);
            stage.setY(event.getScreenY() - yOffset);
        });
        root.setOnMousePressed(event -> {
            event.consume();
            xOffset = event.getSceneX();
            yOffset = event.getSceneY();
        });
        root.setOnMouseMoved(this::mouseMoveHandle);
        root.setOnMouseDragged(this::mouseDraggedHandle);
    }

    private Stage getStage() {
        if (stage == null) {
            stage = (Stage) root.getScene().getWindow();
        }
        return stage;
    }

    private void mouseMoveHandle(MouseEvent event) {
        event.consume();
        double x = event.getSceneX();
        double y = event.getSceneY();
        var stage = getStage();
        double width = stage.getWidth();
        double height = stage.getHeight();
        Cursor cursorType = Cursor.DEFAULT;
        bit = 0;
        if (y >= height - RESIZE_WIDTH) {
            if (x <= RESIZE_WIDTH) {
                bit |= 1 << 3;
            } else if (x >= width - RESIZE_WIDTH) {
                bit |= 1;
                bit |= 1 << 2;
                cursorType = Cursor.SE_RESIZE;
            } else {
                bit |= 1;
                cursorType = Cursor.S_RESIZE;
            }
        } else if (x >= width - RESIZE_WIDTH) {
            bit |= 1 << 2;
            cursorType = Cursor.E_RESIZE;
        }
        root.setCursor(cursorType);
    }

    private void mouseDraggedHandle(MouseEvent event) {
        event.consume();
        var primaryStage = getStage();
        double x = event.getSceneX();
        double y = event.getSceneY();
        double nextX = primaryStage.getX();
        double nextY = primaryStage.getY();
        double nextWidth = primaryStage.getWidth();
        double nextHeight = primaryStage.getHeight();
        if ((bit & 1 << 2) != 0) {
            nextWidth = x;
        }
        if ((bit & 1) != 0) {
            nextHeight = y;
        }
        if (nextWidth <= MIN_WIDTH) {
            nextWidth = MIN_WIDTH;
        }
        if (nextHeight <= MIN_HEIGHT) {
            nextHeight = MIN_HEIGHT;
        }
        primaryStage.setX(nextX);
        primaryStage.setY(nextY);
        primaryStage.setWidth(nextWidth);
        primaryStage.setHeight(nextHeight);
    }
}

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/77410.html

相關(guān)文章

  • JavaFX 8 下簡(jiǎn)化自定義控件的外部調(diào)用以及流式布局示例

    摘要:故可采用自定義控件的方式簡(jiǎn)化外部的代碼調(diào)用。自定義控件的設(shè)計(jì)版本之后,提供寫(xiě)法,此時(shí)要求必須繼承自節(jié)點(diǎn)對(duì)象,使用加載時(shí),必須調(diào)用方法。 「博客搬家」 原地址: 簡(jiǎn)書(shū) 原發(fā)表時(shí)間: 2017-05-21 有一個(gè)項(xiàng)目,需要模擬數(shù)千臺(tái)設(shè)備的工作情況,這數(shù)千個(gè)設(shè)備分為若干組,每組 100 臺(tái)。故需要設(shè)計(jì)一款 GUI 程序,包含 100 個(gè)自定義控件,模擬一組設(shè)備的工作情況,通過(guò) List...

    MartinHan 評(píng)論0 收藏0
  • JavaFX 學(xué)習(xí)筆記——窗口控件

    摘要:創(chuàng)建窗口添加類(lèi)為元素間空隙與主窗口創(chuàng)建過(guò)程相同,新建布局及控件,最后使用的方法顯示出來(lái)。設(shè)置主窗口中的按鈕事件,點(diǎn)擊按鈕后會(huì)顯示一個(gè)窗口。這時(shí)我們可以通過(guò)函數(shù)設(shè)置窗口關(guān)閉時(shí)觸發(fā)的事件在關(guān)閉窗口時(shí),首先執(zhí)行這一事件處理函數(shù),再將窗口關(guān)閉。 前言 如今比較流行的桌面gui框架有WPF、WinForm、Qt、javafx等。其中WPF和WinForm目前還只能在運(yùn)行Winsows上。Qt(w...

    Pocher 評(píng)論0 收藏0
  • JavaFx系列教程之一:JavaFx+Springboot+Maven 開(kāi)發(fā)打包教程

    摘要:最近在用開(kāi)發(fā)窗體程序,并且以后打算把所有的窗體軟件切換到上面,并且還想用的各種好處,集成了就可以愉快的用各種服務(wù)了。最重要的是打包工具。由于我是,一般用和,執(zhí)行命令會(huì)看到打包成了和兩種類(lèi)型的安裝包。由于沒(méi)有計(jì)算機(jī),所以還不知道打包成的狀態(tài)。 最近在用 JavaFx 開(kāi)發(fā)窗體程序,并且以后打算把所有的窗體軟件切換到 JavaFx 上面,并且還想用 springboot 的__各種好處,集...

    Coding01 評(píng)論0 收藏0
  • Java? 教程(匿名類(lèi))

    匿名類(lèi) 匿名類(lèi)可以使你代碼更簡(jiǎn)潔,它們使你能夠同時(shí)聲明和實(shí)例化一個(gè)類(lèi),它們就像局部類(lèi),除了它們沒(méi)有名稱(chēng),如果你只需要使用局部類(lèi)一次,請(qǐng)使用它們。 聲明匿名類(lèi) 雖然局部類(lèi)是類(lèi)聲明,但匿名類(lèi)是表達(dá)式,這意味著你在另一個(gè)表達(dá)式中定義該類(lèi),以下示例HelloWorldAnonymousClasses在局部變量frenchGreeting和spanishGreeting的初始化語(yǔ)句中使用匿名類(lèi),但使用局部類(lèi)...

    xietao3 評(píng)論0 收藏0
  • 【瀏覽器&exe桌面應(yīng)用】用javafx webview 打造自己的瀏覽器

    摘要:背景項(xiàng)目需要做一個(gè)客戶(hù)端的殼,內(nèi)置瀏覽器,訪問(wèn)指定的采用技術(shù)開(kāi)始吧環(huán)境配置略效果 背景 項(xiàng)目需要做一個(gè)客戶(hù)端的殼,內(nèi)置瀏覽器,訪問(wèn)指定 的url 采用技術(shù) java 1.8 開(kāi)始吧! java環(huán)境配置略 hello world import javafx.application.Application; import javafx.beans.value.ChangeListener;...

    mdluo 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<